|
靠,最近天天加班,忙得头疼,连续3天没睡好觉。一天就睡4个小时,惨!!!
今天给大家写点东西。
呵呵同事光驱坏了,底下这段代码挺长,我慢慢敲,有错的地方大家可以提出来。呵呵
#cinlude <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPre,PSTR szCmdLine,int iCmdshow)
{
static TCHAR szAppName[] = TEXT("窗口");
//大家想想 上面可不可以这么些 static TCHAR* psAppName = TEXT("窗口");
HWND hwnd;//定义窗口句炳
MSG msg;//定义消息结构体变量
WINDCLASS wndclass;//定义窗体类变量基于窗体的所有信息基本上封装在这个类里
wndclass.style = CS_HREDRAW | CS_VREDRAW;/窗体的模式定义,左右改变窗体
//大小时,重新绘制客户区
wndclass.lpfnWndProc = WndProc;//这里是把函数地址付给类的成员变量,我向大家没忘记
//函数名和类名数组名一样是一个指针吧,
//还有就是不是程序运行到这个点时,启动事件驱动函数
wndclass.cbClsExtra = 0; //这个成员变量基本上等于被废弃,一般很少用它,也可以将其赋
//值为NULL
wndclass.cbWndExtra = 0;//同上,在以后我会给大家举例子说明如何使用上面的成员变量
//暂且把他们认为是保留字
wndclass.hInstance = hInstance; // 程序运行时唯一标志符
wndclass.hInon = LoadIcon(NULL,IDI_APPLICATION);//这里是控制窗体左上角显示的小图
//表。这里使用的是默认图表,如果想用自己做的,可以把第二个参数改变
//同时第一个参数相应的改变为hInstance
wndclass.hCursor = LoadCursor(NULL,IDI_ARROW)//这里是设置光标图案,其他同上。
// 窗体客户区背景色的设置 ---- 白色
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL; //菜单设置-------无
wndclass.lpszClassName = szAppName; //类名的设置
//下面就是注册窗口类,说白了 就是想系统申请资源
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,"123","123456",NULL);
}
// 接下来就得创建窗体
hwnd = CreateWindow(
类名,
窗口标题,
窗口样式,
横向坐标起始点,//就是窗口左上角在屏幕中的位置
纵向坐标起始点,//就是窗口左上角在屏幕中的位置
横向坐标末端点,//就是窗口右下角在屏幕中的位置
纵向坐标末端点//就是窗口右下角在屏幕中的位置
);
// 显示窗口
ShowWindow(hwnd,iCmdShow);
// 更新窗口
UpdateWindow(hwnd);
//消息循环(略)
//程序返回
}
呵呵 省略不少东西,不过大致的意思大家应该能看懂,个人感觉注释够详细了。
上面的代码中,我们要的关键东西就是 hInstance,和 hwnd ,只要我们拥有这两个变量,我们就可以在其他的程序里对上面的资源为所欲为
程序的主体时消息循环,别的只是资源的初始化
消息循环其实是个“死”循环。除非我们单击关闭按钮,向系统发送关系信息,这是GetMesage函数的返回值是假,这样程序就结束。那么程序如何来处理消息
消息循环如下
if(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);//这里我们分析与解析消息
DispatchMessage(&msg); //这里我们发送消息
// 我们通过lpfnWndProc 来调用WndProc函数,因为在上面我们把函数WndProc的地址赋
//值给lpfnWndProc ,所以这里就可以直接用lpfnWndProc来替代函数名WndProc,注意这
//里没有宏的概念,只是简单的指针操作。
}
下面是消息处理函数。更多人看到的是用switch,其实多一样,个人感觉这样更便于理解,有人说,你这样做不对,很有可能两个消息的值是一样的,如果这有这种情况,用switch也是错的,因为将会有个消息无法得到启动
LRESULT CALLBACK WndProc(HWND,UINT msg,WPARAM,LPARAM)
{
//略
if(msg == WM_CREATE)
{
//
调用CreateWindow函数成功时,启动这个消息
return ;
}
if(msg == WM_PAINT)
{
//当窗体的一部分无效时,我们会自己去触发这个消息,重新绘制窗口,否则无效区域
//将是一片空白
return ;
}
if(msg == WM_DESTROY)
{
//程序结束时我们触发这个消息
return;
}
}
我靠 终于讲完这篇,不知道兄弟们有没有理解,呵呵,下次咱做个能跑起来并且能做点东西的东东 |
|