Windows02.写一个窗口

大致流程:
1. 写WinMain函数,即入口函数。
2. 创建一个窗口类,创建窗口,设置刷新等等。
3. 进行消息循环。
4. 编写窗口过程函数。

先看看WinMain函数:

int WINAPI WinMain(
    HINSTANCE hInstance,      // 当前实例句柄
    HINSTANCE hPrevInstance,  // 前一个实例句柄
    LPSTR lpCmdLine,          // 命令行参数
    int nCmdShow              // 如何显示
    )

再看看怎么创建窗口:
说在前面:关于样式之类的请查看MSDN或者百度。
1. 设计窗口类:

typedef struct _WNDCLASS {
    UINT style;// 窗口样式
    WNDPROC lpfnWndProc;//函数指针,指向窗口处理函数
    int cbClsExtra;//附加内存,一般为0
    int cbWndExtra;//窗口附加内存,一般也为0
    HINSTANCE hInstance;//实例句柄
    HICON hIcon;//窗口的图标句柄
    HCURSOR hCursor;//窗口鼠标光标
    HBRUSH hbrBackground;//窗口背景色
    LPCTSTR lpszMenuName;//窗口菜单名
    LPCTSTR lpszClassName;// 窗口类名
} WNDCLASS, *LPWNDCLASS;

2.注册窗口类

RegisterClass(&窗口类);//注册窗口类

3.创建窗口

HWND CreateWindow(
    LPCTSTR lpClassName,//类名
    LPCTSTR lpWindowName,//窗口名
    DWORD dwStyle,//样式
    int x,//初始x坐标
    int y,//初始y坐标
    int nWidth,//窗口宽度
    int nHeight,//窗口高度
    HWND hWndParent,//父窗口句柄
    HMENU hMenu,//菜单句柄
    HANDLE hlnstance,//实例句柄
    LPVOID lpParam//数据指针,指向CLIENTCREATESTRUCT结构体,一般指向NULL
    );

4.显示和刷新窗口

ShowWindow(hwnd,SW_SHOWNORMAL);//激活并显示
UpdateWindow(hwnd);

这里写图片描述
进入消息循环:

MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

也就是第一章说的那个卖冰淇淋的,不断接受消息,查看对应事件,并处理,处理的过程在窗口过程函数。

编写窗口处理函数:
其实就是个回调函数,当消息进来的时候,判断属于哪个消息,然后进行对应操作。

LRESULT CALLBACK WinSunProc(
    HWND hwnd,    //句柄  
    UINT uMsg,    //消息
    WPARAM wParam,  //附加参数1
    LPARAM lParam   //附加参数2
    )
{
    switch(uMsg)
    {
    case WM_CHAR:
        char szChar[200];
        sprintf(szChar,"char is %d",wParam);
        MessageBox(hwnd,szChar,"HappyTeemo",0);
        break;
    case XXX:
        ........
    }
    return 0;
}

下面是整体代码:所有是HappyTeemo的都是可以自由修改的

#include <Windows.h>
#include <stdio.h>

//声明窗口过程函数
LRESULT CALLBACK WinSunProc(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
    );

//主函数
int WINAPI WinMain(
    HINSTANCE hInstance,      // handle to current instance
    HINSTANCE hPrevInstance,  // handle to previous instance
    LPSTR lpCmdLine,          // command line
    int nCmdShow              // show state
    )
{
    const char* ClassName = "HappyTeemo";

    //设计窗口类
    WNDCLASS wndcls;
    wndcls.cbClsExtra = 0;
    wndcls.cbWndExtra = 0;
    wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wndcls.hCursor = LoadCursor(NULL,IDC_CROSS);
    wndcls.hIcon = LoadIcon(NULL,IDI_ERROR);
    wndcls.hInstance = hInstance;
    wndcls.lpfnWndProc = WinSunProc;
    wndcls.lpszClassName = ClassName;
    wndcls.lpszMenuName = NULL;
    wndcls.style = CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&wndcls);//注册窗口类

    //创建窗口
    HWND hwnd;
    hwnd = CreateWindow(ClassName,"HappyTeemoFirstWindow",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);

    //显示和刷新窗口
    ShowWindow(hwnd,SW_SHOWNORMAL);
    UpdateWindow(hwnd);

    //定义消息结构体,开始消息循环
    MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

//窗口过程函数
LRESULT CALLBACK WinSunProc(
    HWND hwnd,      
    UINT uMsg,      
    WPARAM wParam,  
    LPARAM lParam   
    )
{
    switch(uMsg)
    {
    case WM_CHAR: //按下字符键
        char szChar[200];
        sprintf(szChar,"char is %d",wParam);
        MessageBox(hwnd,szChar,"HappyTeemo",0);
        break;
    case WM_LBUTTONDOWN://鼠标左键
        MessageBox(hwnd,"mouse clicked","HappyTeemo",0);
        HDC hdc;
        hdc=GetDC(hwnd);
        TextOut(hdc,0,50,"HappyTeemo",strlen("HappyTeemo"));
        ReleaseDC(hwnd,hdc);
        break;
    case WM_PAINT: //重绘
        HDC hDC;
        PAINTSTRUCT ps;
        hDC=BeginPaint(hwnd,&ps);
        TextOut(hDC,0,0,"HappyTeemo",strlen("HappyTeemo"));
        EndPaint(hwnd,&ps);
        break;
    case WM_CLOSE://关闭
        if(IDYES==MessageBox(hwnd,"Close?","HappyTeemo",MB_YESNO))
        {
            DestroyWindow(hwnd);
        }
        break;
    case WM_DESTROY://销毁
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd,uMsg,wParam,lParam);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐的提千万

江山父老能容我,不使人间造孽钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值