窗口程序完整流程

窗口创建过程:
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,做学习笔记用,加深印象,
欢迎大家指正错误和给出建议,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值