PDA

Ver la versión completa : Duda de programacion de windows en c



tiutiu
08-07-2002, 15:23
Estoy intentando hacer un programilla de windows en c y hay una cosa q no me sale, en la region cliente de la ventana escribo un numero q va aumentado, osea q pongo un contador q se tendria q ir actualizando a cada vuelta q da al bucle de mensajes de la aplicacion (el while (getmessage(blablablabla)) pero no me lo redibuja, he probado con UpdateWindow(), mandando un mensaje WM_PAINT, o llamando a una funcion q escribe el texto, pero nada, no dibuja nada. Alguien sabe q puedo hacer? (el wndclass.style tiene el VREDRAW y HREDRAW)

eXcalibur
08-07-2002, 18:26
mmm, no se a que nivel estas trabajando en VC++, pero si estás rascando las apis sin usar las MFC, mira si tienes el siguiente codigo en el evento WM_PAINT.


case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd, &rect);

EndPaint(hwnd, &ps);
return 0;


Solo te pongo el WM_PAINT, ya me contarás

tiutiu
09-07-2002, 00:44
si, eso tb lo he intentado, meter to eso en el WM_PAINT, pero solo lo pinta una vez, por mucho q le mande el mensaje WM_PAINT o el UpdateWindow() (aunq el getclientrect no lo uso, uso SetText o algo asi). Si, solo uso apis, nada d MFC. Thx por la ayuda.

Un saludo

eXcalibur
09-07-2002, 10:32
Es una putada porque no puedo probar nada en VC en el curro porque salta constantemete ese mensaje tan conocido "no se ha podido read la memoria" cuando habro el VC, pero creo que este codigo funcionaba.


---------------------------------------------------------------------------------

#include<windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

HINSTANCE hIns;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR SzCmdLine,int iCmdShow)
{
static char szAppName[]="holaWin";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
hIns=hInstance;
//global HINSTANCE HInstance;

wndclass.cbSize =sizeof(wndclass);
wndclass.style =CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc =WndProc;
wndclass.cbClsExtra =0;
wndclass.cbWndExtra =0;
wndclass.hInstance =hInstance;
wndclass.hIcon =LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor =LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground =(HBRUSH) GetStockObject (GRAY_BRUSH);
wndclass.lpszMenuName =NULL;
wndclass.lpszClassName =szAppName;
wndclass.hIconSm =LoadIcon(NULL, IDI_APPLICATION);

RegisterClassEx(&wndclass);

hwnd= CreateWindow(szAppName,
"Hola pedro",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);

ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);


while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
static HWND io;
static HWND io2;
static HWND io3;
static HWND Btn;
int val1;
int val2;
char res[10];
switch(iMsg)
{

case WM_CREATE:

io=CreateWindow("Edit",
"",
WS_CHILD|ES_NUMBER|WS_VISIBLE,
100,
150,
120,
20,
hwnd,
NULL,
hIns,
NULL);

io2=CreateWindow("Edit",
"",
WS_CHILD|ES_NUMBER|WS_VISIBLE,
250,
150,
120,
20,
hwnd,
NULL,
hIns,
NULL);

io3=CreateWindow("Edit",
"",
WS_CHILD|ES_NUMBER|ES_READONLY|WS_VISIBLE,
400,
150,
120,
20,
hwnd,
NULL,
hIns,
NULL);

Btn=CreateWindow("button",
"sumar",
WS_CHILD|WS_VISIBLE,
250,
200,
120,
20,
hwnd,
NULL,
hIns,
NULL);
return 0;

case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);

GetClientRect(hwnd, &rect);

//DrawText(hdc,"",1, &rect,
// DT_SINGLELINE | DT_CENTER | DT_VCENTER);

EndPaint(hwnd, &ps);
return 0;

case WM_DESTROY:
PostQuitMessage(0);
return 0;

case WM_COMMAND:
{
switch LPARAM
{
case Btn:
val1=2;
val2=2;
SetWindowText(io2,itoa(val1+val2,res,10));
}

return 0;
}
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}


----------------------------------------------------------------------------------

Supongo que aunque lo he pegado todo este foro no permitirá que se vea todo, asi que tendrás que currartelo, jeje

eXcalibur
09-07-2002, 10:32
Que cabron, ni tan solo respeta las tabulaciones, jajajajaj

tiutiu
10-07-2002, 13:03
Menuda mierda, si uso el switch (lParam) me dice "case expression not constant", asi q tengo q usar un if (lParam == (long)Btn) y entonces si funciona. Pero el problema no es ese, con controles tb lo se hacer yo. El caso es q quiero escribir en el fondo con DrawText a cada vuelta del bucle de los mensajes (lo q hago es incrementar un contador y llamar a DrawText, pero solo escribe cuando minimizo y vuelvo a mostrar la pantalla o cuando le paso una ventana por encima.

eXcalibur
10-07-2002, 13:09
Claro, lo tienes que refrescar por código, ahora solo se te refresca por evento, ya he entendido tu problema.
Mira, si quieres pasamelo a y lo miro porque hace tiempo que no toco el VC a tan bajo nivel.
Por cierto, que cuando llegues a las MFC sentirás un desahogo increible, jajaja, cuando tengo que hacer alguna cosa siempre lo hago con MFC, es mas amigable.
Bueno, ya me dirás algo, saludossss