窗口创建过程:
0.创建主函数
1.配置窗口类
2.注册窗口类
3.创建窗口
4.显示及更新窗口
5.消息队列
6.回调函数过程
开发环境:Window 10,VS2015。
首先:包含windows.h 等头文件。
下面详述 函数过程名加粗显示 ,/ 注释块/。
0.创建入口函数:
WinMain(
HINSTANCE hInstance,/含义:当前实例程序句柄/
HINSTANCE hPrevInstance,/含义:先前实例句柄,点击两次运行,出现两个窗口,第二个窗口的此参数,就是第一个窗口的句柄,依次类推/
LPSTR IPCmdLine,/命令行参数,LP:LONG POINT 长指针/
INT NCmdShow/显示状态/
){
………… /代码块/
};
ps:句柄(HANDLE):是资源标识(类似指针),按类型分 有 HICON(图标句柄),HCURSOR(光标句柄),HWND(窗口句柄),应用程序句柄(HINSTACNE),设备上下文句柄(HDC)……
1.配置窗口类(在主函数中):
用类名(WNDCLASS)声明变量(myWnd)后,为变量(myWnd)的各个属性赋值;
eg:
myWnd.IpfnWndProc=winSunProc; /自己命名, 回调函数名 /
myWnd.cbClsExtra=0; /类额外数据/
myWnd.cbWndExtra=0;
myWnd.hInstance =hInstance ;/当前应用程序句柄/
myWnd.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);/窗口背景颜色/
myWnd.hCursor = LoadCursor(NULL, IDC_HAND);
myWnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);
myWnd.lpszClassName = (LPCWSTR)”xyy2016”; /窗口名/
myWnd.lpszMenuName = NULL;
myWnd.style = CS_HREDRAW | CS_VREDRAW; /窗口显示格式,垂直重画水平重画/
2.注册窗口类:
RegisterClass(&myWnd);
3.创建窗口:
首先创建句柄HWND hwnd;
hwnhwnd=CreateWindow((LPCWSTR)”xyy2016”(LPCWSTR)”第一个窗口”,
WS_OVERLAPPEDWINDOW,
0,0,600,400,NULL,NULL,hInstance,NULL);
函数参数依次是:窗口类名,窗口名,窗口类型,显示坐标x,显示坐标y,宽,高,副窗口句柄,菜单句柄,当前应用程序句柄,附加参数;
4.显示窗口:
ShowWindow(
hwnd,/窗口句柄/
SW_SHOWNORMAL/显示格式/
);
UpdateWindow(hwnd);/更新窗口/
5.消息队列:
用来处理窗口产生的消息,如在窗口内按钮点击,鼠标点击,键盘点击……
MSG msg;
while (GetMessage(&msg, hwnd, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
6.回调函数过程:
LRESULT CALLBACK WinSunProc(
HWND hwnd,/窗口句柄/
UINT umsg,/消息身份/
WPARAM wparam,/消息变量/
LPARAM lparam/第二个消息变量/
) {
switch (umsg) {
case WM_PAINT:
………/消息处理方法/
break;
case WM_CLOSE:
………/消息处理方法/
break;
………/消息处理方法/
default:/很必要/
return DefWindowProc(hwnd,umsg,wparam,lparam);
}
return 0;
}
下面附上自己学习的例子:
#include<windows.h>
#include<stdio.h>
using namespace std;
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT umsg,
WPARAM wparam,
LPARAM lparam
);
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE HprevInstance,
LPSTR lpCmdLine,
INT nCmdShow
)
{
WNDCLASS myWnd;
myWnd.cbClsExtra = 0;
myWnd.cbWndExtra = 0;
myWnd.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
myWnd.hCursor = LoadCursor(NULL, IDC_HAND);
myWnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);
myWnd.hInstance = hInstance;
myWnd.lpfnWndProc = WinSunProc;
myWnd.lpszClassName = "xyy2016";
myWnd.lpszMenuName = NULL;
myWnd.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&myWnd);
HWND hwnd;
hwnd=CreateWindow("xyy2016", "第一个窗口",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);
MSG msg;
while (GetMessage(&msg, hwnd, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT umsg,
WPARAM wparam,
LPARAM lparam
) {
switch (umsg) {
case WM_CHAR:
char szChar[20];
//sprintf(szChar,"char is %d",wparam );
MessageBox(hwnd, szChar, "xyy2016", 0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"mouse clicked", "xyy2016", 0);
HDC hdc;
hdc = GetDC(hwnd);
TextOut(hdc, 50, 50, "喜洋洋文本",strlen("喜洋洋文本"));
ReleaseDC(hwnd, hdc);
break;
case WM_PAINT:
PAINTSTRUCT ps;
hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 0, 50, "哈哈哈", strlen("哈哈哈"));
EndPaint(hwnd, &ps);
break;
case WM_CLOSE:
if (IDYES == MessageBox(hwnd,"是否真的结束", "xyy2016", MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,umsg,wparam,lparam);
}
return 0;
}
以上是整个创建窗口的过程,新手刚学MFC,做学习笔记用,加深印象,
欢迎大家指正错误和给出建议,谢谢!