Não você terá que migrar para GUI, não testei se a função WIN_PRINTDLGDC funciona em console, mas creio que não porque ela é gui.
Então vc terá que migrar para gui, o que eu to usando como gui é a GT_WVW, mas não gostei dela limita muito o designer e estou tentando migrar para HW_Gui, só não consegui ainda porque as duas não funcionam juntas, pelo menos não consegui ainda.
Então já que você ainda não esta em GUI, sugiro que migre para HW_GUI e daí as minhas funções não lhe serviriam, mas contudo colocar o fonte abaixo.
Código: Selecionar todos
Procedure ShowMessage(nTop,nLft,cMsg,cTime,cTxt) //mensagens FIXA
Return DrawShow(cMsg,cTxt,nTop,{"&Ok"},1,1,2)
//*
Procedure ShowWait(nTop,nLft,cMsg,cTxt) //mensagem de processamento
Return DrawShow(cMsg,cTxt,nTop,,,,3)
//*
Procedure ShowWaitProc(aMessage,oTempo)
Local xTempo:=Seconds()-aSeconds
WVW_ProcessMessages()
If oTempo # Nil .And. oTempo > 0
ShowWait(,,aMessage)
Inkey(oTempo)
CloseWindow()
EndIf
If xTempo>2.Or.mpg=0//segundos
aSeconds:=Seconds()
mpg:=If(mpg>60,0,mpg+1)
wvw_Paint(nCurWindow)
EndIf
Return .T.
//*
Function NewAnsWer(cMsg,cTxt,nTop,nBut,nNil,nEsc,nFoc,nSho) //perguntas
Return DrawShow(cMsg,cTxt,nTop,nBut,nEsc,nFoc,nSho)
// SHOWMESSAGE, SHOWWAIT, NEWANSWER chamam a debaixo para execução.
Function DrawShow(cMsg,cTxt,nTop,nBut,nEsc,nFoc,nSho) // FAZ TODA TELA DE EXECUCAO : ANSWER, SHOWWAIT, ETC chamando a DRAWEXEC
Local nLft,nRig,nBot // controla a posicao da janela, ficando controlado os valores para cada uma delas
Local aMsg:={} //controla a mensagem, colocando assim local fica as escritas corretas para cada janela
mpg :=0 //controla o carrinho passando, assim fica uma posicao para cada janela
//////////// DEFINICAO DAS VARIAVEIS ACIMA
//////////// Acerto dos dados abaixo
nSho:=If(nSho=Nil,1,nSho)
cMsg:=If(cMsg=Nil.And.nSho=3,{"Aguarde processamento..."},If(cMsg=Nil,"Escolha a opção desejada, ou <ESC> para cancelar.",cMsg))
nFoc:=If(nFoc=Nil,2,nFoc)
cTxt:=If(cTxt=Nil,"Atenção!",cTxt)
nTop:=If(nTop=Nil,10,If(nTop>15,1,nTop))
nBot:=nTop+8
//////////// Transforma cMsg em MATRIZ
If ValType(cMsg)=="A"
aMsg:=cMsg
Else
AAdd(aMsg,cMsg)
EndIf
/// chamo a drawexec e oresto é faz tudo
Return DrawExec(aMsg,cTxt,nTop,nLft,nRig,nBot,nBut,nEsc,nFoc,nSho)
//*
Function DrawExec(aMsg,cTxt,nTop,nLft,nRig,nBot,nBut,nEsc,nFoc,nSho)
Local Keyin:=0,aRet:=If(nBut=Nil,"L","N") //controla se é logico ou nao
Local oMText:=0
nBut:=If(nBut=Nil,{"&Sim","&Não"},nBut)
nLft:=If(nSho=3,10,If(Len(nBut)=4,15,If(Len(nBut)=3,20,25)))
nRig:=If(nSho=3,70,If(Len(nBut)=4,65,If(Len(nBut)=3,60,55)))
//////////// Verifica qual linha é a maior para saber o tamanho da janela abaixo
For ixx:=1 To Len(aMsg)
oMText:=If(Len(aMsg[ixx]) > oMText,Len(aMsg[ixx]),oMText)
Next
//////////// Arruma o tamanho da janela de acordo com o texto
While oMText > (nRig-nLft-4) //-08 -5
nLft-- //mais para esquerda
nRig++ //mais para direita
If nLft <= 1 //.Or. nRig > 100
Exit
EndIf
End
//////////// Emite som apenas para pergunta e exclamação
//////////// nsho 1 = PERGUNTA
//////////// nsho 2 = EXCLAMACAO
//////////// nsho 3 = AGUARDE BONECO
//////////// nsho 4 = AGUARDE CARRINHO
//////////// nsho 5 = PROCESSAMENTO AZUL
If nSho=1 //pergunta
C_PLAYSOUND(wD_Audios+"pergunta.wav")
ElseIf nSho=2 //exclamacao
C_PLAYSOUND(wD_Audios+"notifica.wav")
EndIf
//////////// AQUI COMEÇA O DESENHO
//SetCursor(0)
//////////// 1º= LABEL TEXTO EM NEGRITO ; 2º= LINHA SEPARADORA ; 3º= BOX COM FUNDO BRANCO PARA TEXTO ; 4º= LINHA SEPARADORA
If wE_ModelSys$"NB".And.nSho=2 //resposta vermelho
//novo
xDfB:=nBot-nTop
nTop:=If(nTop-2 > 1,nTop-2,nTop)
nBot:=nTop+xDfB
OpenWindow(nTop-2,nLft,nBot,nRig," ",,,,,,11) //,cTxt) //,,,,,,,WS_CAPTION) //WS_CLIPCHILDREN) //WS_OVERLAPPEDWINDOW+
AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop-1,nLft,nTop+1,nRig-7,RGB(139,0,0))}) //39,64,139 54,54,54
AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop+2,nLft,nBot ,nRig ,RGB(139,0,0))}) //39,64,139 54,54,54
NewShowLabel(nTop-1,nLft," "+cTxt,"ESQUERDA","AMARELO",64,14,nTop-1,nRig-8,RGB(139,0,0),"ARIAL")
ElseIf wE_ModelSys$"NB".And.nSho=1 //pergunta azul
xDfB:=nBot-nTop
nTop:=If(nTop-2 > 1,nTop-2,nTop)
nBot:=nTop+xDfB
OpenWindow(nTop-2,nLft,nBot,nRig," ",,,,,,11) //,cTxt) //,,,,,,,WS_CAPTION) //WS_CLIPCHILDREN) //WS_OVERLAPPEDWINDOW+
AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop-1,nLft,nTop+1,nRig-7,RGB(0,0,139))}) //39,64,139 54,54,54
AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop+2,nLft,nBot ,nRig ,RGB(0,0,139))}) //39,64,139 54,54,54
NewShowLabel(nTop-1,nLft+1," "+cTxt,"ESQUERDA","AMARELO",64,14,nTop-1,nRig-8,RGB(0,0,139),"ARIAL")
ElseIf wE_ModelSys$"NB".And.nSho=3 //showwait
xDfB:=nBot-nTop
nTop:=If(nTop-2 > 1,nTop-2,nTop)
nBot:=nTop+xDfB
OpenWindow(nTop-2,nLft,nBot,nRig," ",,,,,,11) //,cTxt) //,,,,,,,WS_CAPTION) //WS_CLIPCHILDREN) //WS_OVERLAPPEDWINDOW+
AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop-1,nLft,nTop+1,nRig-7,RGB(255,215,0))}) //39,64,139 54,54,54
AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop+2,nLft,nBot ,nRig ,RGB(255,215,0))}) //39,64,139 54,54,54
NewShowLabel(nTop-1,nLft+1," "+cTxt,"ESQUERDA","PRETO",64,14,nTop-1,nRig-8,RGB(255,215,0),"ARIAL")
Else //antigo
OpenWindow(nTop-2,nLft,nBot,nRig) //,cTxt) //,,,,,,,WS_CAPTION) //WS_CLIPCHILDREN) //WS_OVERLAPPEDWINDOW+
AddObjects(nCurWindow,{|nWindow| wvw_DrawLabel(nWindow,nTop+1,nLft+1,cTxt+":",TA_LEFT,,RGB( 0,0,0),,"ARIAL",20-o_wvwFR,12-o_wvwLR,700,,.T.,)})
EndIf
AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nTop+2,nLft,nBot-3,nRig,RGB(255,255,255))}) //
AddObjects(nCurWindow,{|nWindow| wvw_DrawLine(nWindow,nTop+1,nLft,nTop+1,nRig,0,0,2,PS_SOLID,0,RGB(156,156,156))}) //PS_DASH, PS_SOLID
AddObjects(nCurWindow,{|nWindow| wvw_DrawLine(nWindow,nBot-3,nLft,nBot-3,nRig,0,0,2,PS_SOLID,0,RGB(156,156,156))}) //PS_DASH, PS_SOLID linha final
/////////// Desenha a imagem da tela //pergunta exclamacao a esquerda
AddObjects( nCurWindow, {|nWindow| wvw_DrawImage( nWindow,nTop+2,nLft,nTop+5,nLft+7,nSho)})
If nSho=3
/////////// Desenha a imagem da tela a direita se for aguarde processamento
AddObjects(nCurWindow,{|nWindow| wvw_DrawImage( nWindow,nTop+2,nRig-8,nTop+5,nRig,6)})
AddObjects(nCurWindow,{|nWindow| wvw_FillRectangle(nWindow,nBot-1,nLft,nBot ,nRig,RGB(255,255,255))}) //
AddObjects(nCurWindow,{|nWindow| wvw_DrawLine(nWindow,nBot-2,nLft,nBot-2,nRig,0,0,2,PS_SOLID,0,RGB(156,156,156))}) //PS_DASH, PS_SOLID
AddObjects(nCurWindow,{|nWindow| wvw_DrawLine(nWindow,nBot ,nLft,nBot ,nRig,0,0,2,PS_SOLID,0,RGB(156,156,156))}) //PS_DASH, PS_SOLID linha final
/////////// Desenha o carrinho em baixo a esquerda
AddObjects( nCurWindow, {|nWindow| wvw_DrawImage( nWindow,nBot-1,nLft+mpg,nBot,nLft+3+mpg,4)})
EndIf
/////////// Abaixo as linhas com os textos se existirem
If Len(aMsg)>=3
If(Len(aMsg)>=1,AddObjects(nCurWindow,{|nWindow| wvw_drawlabel(nWindow, nTop+2,If(nSho<=2,nLft+10,40),aMsg[1],If(nSho<=2,TA_LEFT,TA_CENTER),,RGB( 0,0,139), RGB( 255, 255, 255 ),"Tahoma",18-o_wvwFR,8-o_wvwLR,400,,.T.,)}),.T.) //crt .t. faz as letras corretas 0,0,139
If(Len(aMsg)>=2,AddObjects(nCurWindow,{|nWindow| wvw_drawlabel(nWindow, nTop+3,If(nSho<=2,nLft+09,40),aMsg[2],If(nSho<=2,TA_LEFT,TA_CENTER),,RGB( 0,0,139), RGB( 255, 255, 255 ),"Tahoma",18-o_wvwFR,8-o_wvwLR,400,,.T.,)}),.T.)
If(Len(aMsg)>=3,AddObjects(nCurWindow,{|nWindow| wvw_drawlabel(nWindow, nTop+4,If(nSho<=2,nLft+09,40),aMsg[3],If(nSho<=2,TA_LEFT,TA_CENTER),,RGB( 0,0,139), RGB( 255, 255, 255 ),"Tahoma",18-o_wvwFR,8-o_wvwLR,400,,.T.,)}),.T.) //crt .t. faz as letras corretas 0,0,139
If(Len(aMsg)>=4,AddObjects(nCurWindow,{|nWindow| wvw_drawlabel(nWindow, nTop+5,If(nSho<=2,nLft+09,40),aMsg[4],If(nSho<=2,TA_LEFT,TA_CENTER),,RGB( 0,0,139), RGB( 255, 255, 255 ),"Tahoma",18-o_wvwFR,8-o_wvwLR,400,,.T.,)}),.T.) //crt .t. faz as letras corretas 0,0,139
ElseIf Len(aMsg)>=1
If(Len(aMsg)>=1,AddObjects(nCurWindow,{|nWindow| wvw_drawlabel(nWindow, nTop+3,If(nSho<=2,nLft+10,40),aMsg[1],If(nSho<=2,TA_LEFT,TA_CENTER),,RGB( 0,0,139), RGB( 255, 255, 255 ),"Tahoma",18-o_wvwFR,8-o_wvwLR,400,,.T.,)}),.T.) //crt .t. faz as letras corretas 0,0,139
If(Len(aMsg)>=2,AddObjects(nCurWindow,{|nWindow| wvw_drawlabel(nWindow, nTop+4,If(nSho<=2,nLft+09,40),aMsg[2],If(nSho<=2,TA_LEFT,TA_CENTER),,RGB( 0,0,139), RGB( 255, 255, 255 ),"Tahoma",18-o_wvwFR,8-o_wvwLR,400,,.T.,)}),.T.)
EndIf
MyKeyBoard("")
////////// CHAMA O REDEZENHO NO ATO DO FINAL DA EDICAO DA MENSAGEM passi so para nsho3
wvw_Paint(nCurWindow) //tem que chamar para mostrar o desenho senao nao mostra e não aciona o mouse
/////////// Se for pergunta ou mensagem, mostra o botão e fecha a janela
If nSho<=2
Keyin:=MyNewButton(nBot-1,nFoc,nBut,nRig,.F.)
CloseWindow()
Else
EndIf
Return If(aRet=="L",Keyin=1,Keyin)
Código: Selecionar todos
Function BtClick(OnClick)
oBKey:=nBPos:=OnClick
HB_KeyPut(13)
Return .T.
//*
Static Procedure PCNewButton(nBot,nFoc,nBut,nCol)
nBSty:=1
nBStB:=Nil //0.5 //1.0 = todo botao, 0.5 50% 0 = nao vai ser estidado
nBM3D:=Nil //.T. //.T. transparante .f. nao transparente
nBImg:=Nil //wD_Images+"OK3D.BMP"
nColA:=nCol-11 //11 77 ou 69 -1 inicial na direita da tela
wvw_pbsetfont(, ,19-o_wvwFR,8-o_wvwLR,FW_BOLD)
If Len(nBut)>=5 //tem quarto botao //img //bloco //aof //1.0 0.5 0
If(nBPos>0,wvw_PBDestroy(NIL,nBt5),.T.) //se existir eu apago //IT
nBt5:=WVW_PBcreate( nCurWindow, nBot, nColA ,nBot, nColA+10,If(nFoc=5,"(","")+ MyWinLetra(nBut[5])+If(nFoc=5,")",""),nBImg, {|| BTClick(5) }, Nil,nBStB,nBM3D)
wvw_pbSetStyle(NIL, nBt5,If(nFoc=5,nBSty,)) //TRANSPARENTE
nColA:=nColA-12
EndIf
If Len(nBut)>=4 //tem quarto botao //img //bloco //aof //1.0 0.5 0
If(nBPos>0,wvw_PBDestroy(NIL,nBt4),.T.) //se existir eu apago //IT
nBt4:=WVW_PBcreate( nCurWindow, nBot, nColA ,nBot, nColA+10,If(nFoc=4,"(","")+ MyWinLetra(nBut[4])+If(nFoc=4,")",""),nBImg, {|| BTClick(4) }, Nil,nBStB,nBM3D)
wvw_pbSetStyle(NIL, nBt4,If(nFoc=4,nBSty,)) //TRANSPARENTE
nColA:=nColA-12
EndIf
If Len(nBut)>=3 //tem terceiro botao
If(nBPos>0,wvw_PBDestroy(NIL,nBt3),.T.)
nBt3:=WVW_PBcreate( nCurWindow, nBot, nColA ,nBot, nColA+10,If(nFoc=3,"(","")+ MyWinLetra(nBut[3])+If(nFoc=3,")",""),nBImg, {|| BTClick(3) }, NIL,nBStB,nBM3D)
wvw_pbSetStyle(NIL, nBt3,If(nFoc=3,nBSty,))
nColA:=nColA-12
EndIf
If Len(nBut)>=2 //tem segundo botao
If(nBPos>0,wvw_PBDestroy(NIL,nBt2),.T.)
nBt2:=WVW_PBcreate( nCurWindow, nBot, nColA ,nBot, nColA+10,If(nFoc=2,"(","")+ MyWinLetra(nBut[2])+If(nFoc=2,")",""),nBImg, {|| BTClick(2) }, NIL,nBStB,nBM3D)
wvw_pbSetStyle(NIL, nBt2,If(nFoc=2,nBSty,))
nColA:=nColA-12
EndIf
If Len(nBut)>=1 //tem primeiro botao
If(nBPos>0,wvw_PBDestroy(NIL,nBt1),.T.)
nBt1:=WVW_PBcreate( nCurWindow, nBot, nColA ,nBot, nColA+10,If(nFoc=1,"(","")+ MyWinLetra(nBut[1])+If(nFoc=1,")",""),nBImg, {|| BTClick(1) }, NIL,nBStB,nBM3D) //__Keyboard(K_ENTER)
wvw_pbSetStyle(NIL, nBt1,If(nFoc=1,nBSty,))
EndIf
wvw_pbSetFocus(NIL,If(nFoc=5,nBt5,If(nFoc=4,nBt4,If(nFoc=3,nBt3,If(nFoc=2,nBt2,nBt1))))) //focaliza
Return
Procedure MyNewButton(nBot,nFoc,nBut,nCol,nAud,nVie,nLft,nTxt,nFun)
Local xbFundo:=RGB(245,245,220)
Private oBKey:=nBPos:=nBSty:=Ch:=0
Private nBt1:=nBt2:=nBt3:=nBt4:=nBt5:=""
nAud:=If(nAud=Nil,.T.,nAud)
nVie:=If(nVie=Nil,.F.,nVie) //mostra a imagem do boneco
nLft:=If(nLft=Nil,nCol-(10*Len(nBut)),nLft) //coloca a imagem no canto esquerdo da tela
If nAud = .T.
C_PLAYSOUND(wD_Audios+"pergunta.wav")
If nVie = .T.
/////////// Desenha a imagem da tela //pergunta // exclamacao
NewDrawField(nBot-1,nLft,nCol,"",10,nBot+2) //8 linha
NewShowLabel(nBot-1,nLft,"",3,"VERMELHO",30,10,nBot+1,nCol,xbFundo) //,,"FUNDO_BUTTON")
If nTxt # Nil
NewShowLabel(nBot,nLft+1,nTxt,"ESQUERDA","NAVYBLUE",24,11,nBot,nCol,xbFundo) //,,"FUNDO_BUTTON")
EndIf
wvw_Paint(nCurWindow) //tem que chamar para mostrar o desenho senao nao mostra e não aciona o mouse
EndIf
EndIf
PcNewButton(nBot,nFoc,nBut,nCol)
nBPos:=nFoc //foco do botao
nTBt:=Len(nBut) //tamanho do botao
nTBw:=If(nFun # Nil,0,0) //tempo de execucao automatica do botao
Do while !((ch:=inkey(nTBw))==K_ESC) //1 segundo para ele entrar e desenhar a função
If nFun # Nil
ChkLibVenda(.F.) //funcao minha de venda que nao importa para desenhos
EndIf
Do Case
Case ch==K_ENTER //.Or.ch==K_LDBLCLK //enter para selecionar o botao nao colocar
oBKey:=nBPos //recebe o botao posicionado
Case ch==K_TAB .Or. ch==K_RIGHT .Or. ch==K_DOWN //tab avan‡a
nBPos++
Case ch==K_SH_TAB.Or. ch==K_LEFT .Or. ch==K_UP //shift + tab volta
nBPos--
Case (ch<=-1.And.ch>=-9).Or.ch=28.Or.ch=-40.Or.ch=-41 //Fs chama as teclas de funcao
aBlock:=SetKey(ch)
If aBlock#Nil
EVal(aBlock)
ch:=0
EndIf
OtherWise
For i2:=1 To nTBt //varre o vetor
If "&"+Upper(Chr(ch)) $ Upper(nBut[i2])
oBKey:=nBPos:=i2
Exit //sai da execucao com a posição aceita do for
EndIf
Next
EndCase
nBPos:=If(nBPos > nTBt,1,if(nBPos < 1,nTBt,nBPos))
PcNewButton(nBot,nBPos,nBut,nCol)
If oBKey>0 //se okey ja for escolhido no caso das letras, ja sai
Exit
EndIf
EndDo
//apagar o botao
For iX:=1 to nTBt
wvw_PBDestroy(NIL,If(iX=1,nBt1,If(ix=2,nBt2,If(ix=3,nBt3,If(ix=4,nBt4,nBt5)))))
Next
//WVW_SETMOUSEMOVE(,lMouseMove)
If nAud = .T.
If nVie = .T. //apagar
/////////// Desenha a imagem da tela //pergunta // exclamacao
NewDrawField(nBot-1,nLft,nCol,"",10,nBot+2) //8 linha
NewShowLabel(nBot-1,nLft,"",3,"VERMELHO",30,10,nBot+1,nCol,xbFundo) //,,"FUNDO_BUTTON")
EndIf
EndIf
wvw_Paint(nCurWindow) //tem que chamar para mostrar o desenho senao nao mostra e não aciona o mouse ver se vai ficar aqui
Return oBKey
//ufa, creio que é o final de todas os defines abaixo para execução em gui da forma acima.
Espero ter lhe ajudado e não confundido, hehehehe.
Demorei para chegar neste padrão de tela, mas mesmo assim quero migrar para HW_GUI.