铺天盖地的库函数,纠结啊加蛋疼,真的是硬着头皮开始了MFC的学习,通过VC++深入详解的第一章的学习,初步了解了WINDOWS程序内部的运行机制(其实还是晕晕的),自己试着依样画葫芦实现了一个窗口的创建,算是对VC的学习有了一个初步的印象。
要创建一个完整的窗口,并在窗口中响应键盘及鼠标消息,要进行以下的步骤。
1、WinMain函数的定义;
2、创建一个窗口;
3、进行消息循环;
4、编写窗口过程函数;
对于第一个步骤WinMain函数的定义如下:
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
);
对于第二个步骤创建一个完整的窗口,需要经过几个操作步骤,分别是设计一个窗口类,注册一个窗口,创建窗口,显示及更新窗口。
对窗口进行设计:
WNDCLASS wndclass;
wndclass.style=CS_BYTEALIGNCLIENT;
wndclass.lpfnWndProc=first;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);
wndclass.hCursor=LoadCursor(NULL,IDC_HELP);
wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName="林的WINDOWS程序";
注册窗口类:
RegisterClass(&wndclass);
创建及显示窗口:
HWND hwnd;
hwnd=CreateWindow("林的WINDOWS程序","菜鸟的无奈",WS_OVERLAPPEDWINDOW,0,0,600,600,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
第三个步骤是进行消息循环:
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
第四个步骤也是WINDOWS编程中最核心的步骤是窗口过程函数的编写:
LRESULT CALLBACK first(
HWND hwnd,
UINT umsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(umsg)
{
case WM_CHAR:
char str[100];
sprintf(str,"1+1",0);
MessageBox(hwnd,str,"菜鸟的无奈",0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"鼠标输入","菜鸟的无奈",0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"晕头转向",strlen("晕头转向"));
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,"纠结啊纠结",strlen("纠结啊纠结"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,umsg,wParam,lParam);
}
return 0;
}
不得不说,这几段代码包含了许多的知识点,虽然写出了这些代码,但是许多的知识点与原理还需要继续领悟巩固加强,下面附上一段完整的代码,虽然只是一段很简单的代码,但是也还是花了自己很多时间,毕竟刚开始学。
#include <stdio.h>
#include <windows.h>
LRESULT CALLBACK first(
HWND hwnd,
UINT umsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(umsg)
{
case WM_CHAR:
char str[100];
sprintf(str,"1+1",0);
MessageBox(hwnd,str,"菜鸟的无奈",0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"鼠标输入","菜鸟的无奈",0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"晕头转向",strlen("晕头转向"));
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,"纠结啊纠结",strlen("纠结啊纠结"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,umsg,wParam,lParam);
}
return 0;
}
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd
)
{
WNDCLASS wndclass;
wndclass.style=CS_BYTEALIGNCLIENT;
wndclass.lpfnWndProc=first;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);
wndclass.hCursor=LoadCursor(NULL,IDC_HELP);
wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName="林的WINDOWS程序";
RegisterClass(&wndclass);
HWND hwnd;
hwnd=CreateWindow("林的WINDOWS程序","菜鸟的无奈",WS_OVERLAPPEDWINDOW,0,0,600,600,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
要学的还有很多很多,呵呵,烦恼而又乐在其中。