博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows02.写一个窗口
阅读量:7064 次
发布时间:2019-06-28

本文共 4034 字,大约阅读时间需要 13 分钟。

hot3.png

大致流程:

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 
#include
//声明窗口过程函数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;}

转载于:https://my.oschina.net/HappyTeemo/blog/1558431

你可能感兴趣的文章
Eval()和DataBinder Eval(Container DataItem,)的区别及用法
查看>>
探寻路径
查看>>
讨论:技术和创意那个重要?。。。哈哈,我认为技术是创意实现的方法。
查看>>
硬件方案终于谈下来了,松了一口气,呼
查看>>
TOSSIM进行无线传感网络仿真的大致流程
查看>>
微信内打开链接显示已停止访问该网页
查看>>
基于servlet和jsp的简单注册登录页面(包括:增删查改及分页显示)
查看>>
数据结构基础之一
查看>>
10.29随笔
查看>>
ScintillaNET v2.5 简单应用实例讲解
查看>>
I.MX6 Android busybox 从哪里生成的
查看>>
循环节长度 蓝桥杯
查看>>
linux软件安装:源码(1)
查看>>
c++-merge k sorted lists heap的灵活应用
查看>>
干货站
查看>>
RabbitMQ 基础概念介绍
查看>>
1117bootstrap
查看>>
centos6.5上卸载和安装JDK7
查看>>
从文件加载至NSData
查看>>
分享一下自己用c++写的小地图
查看>>