Windows02.写一个窗口

来源:互联网 发布:数据分析ppt图片 编辑:程序博客网 时间:2024/05/16 00:56

大致流程:
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;}
0 0
原创粉丝点击