jaja, basic mata (no me malinterpretes yo tambien empece con basic, pero endulza demasiado la programación)
En basic la mayoría del código que se encarga de crear ventanas es generado automáticamente, pero en c es cosa tuya.
Esto es relativamente complicado, pero existen atajos como MFC (con vc++6 o pagando en las versiones nuevas) o Windows Forms (en las nuevas versiones, con aplicaciones CLR)
Por tu pregunta diria que tienes vc++ 6 ya que en las versiones nuevas el entorno es parecido a vb6, con dos clicks en el control ves el código. En vc++6 (y si quieres tambien el las versiones nuevas) la cosa va como es realmente en windows, tu programa tiene un punto de entrada a partir del que se inicia y a partir de dicho punto debe crear las ventanas (CreateWindow y CreateWindowEx) y manejar los mensajes (casi como eventos en basic) que el usuario envia.
(me salto explicaciones de como se crean las ventanas, si dudas pregunta)
en el momento en el que registras el tipo de ventana que quieres -con RegisterClass() o RegisterClassEx()- debes especificar en la estructura que pasas como parametro (WNDCLASSEX) como atributo lpfnWndProc la direccion de una función que se encargue de manejar todos los "eventos" que puedas recibir
ejemplo
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SMENU));
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = szWindowClass;
wc.hIconSm = LoadIcon(wc.hInstance, MAKEINTRESOURCE(IDI_SMALL));
atom = RegisterClassEx(&wc);
y como no, debemos definir la función de control (en mi caso WndProc)
Código: Seleccionar todo
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_PAINT: //esto equivale al evento Paint de vb6
hdc = BeginPaint(hWnd, &ps);
// TODO: agregar código de dibujo aquí...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY: //y esto a unload (se ejecutará cuando se pulse el aspa roja, alt+f4 ...)
PostQuitMessage(0); //en caso de unload, salimos del programa (no sale solo como en vb6)
break;
default: //si el evento no es ninguno de los anteriores, llamamos a la funcion de control de eventos de windows y
//que se ocupe ella de procesar la petición
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
finalmente, para que nuestro programa no cree la ventana y se cierre, sino que quede esperando mensajes añadimos antes del return()
Código: Seleccionar todo
// Bucle principal de mensajes:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
esto te resultará mas fácil si te bajas del site de microsoft el visual studio 2008 o 2010 (si es que no lo tienes).
No te recomiendo que hagas como muchos y te eches a lo facil con aplicaciones CLR que te simplifican la tarea de crear ventanas, pero te esconden como funcionan las cosas de verdad y no te permiten llamar apis(además, al igual que vb6, tienen una limitación de velocidad mayor). de todas formas podrian ser un buen atajo para programas sencillos.