时间的痕迹
posts - 16, comments - 128, trackbacks - 0, articles - 261
C++博客
首页
新随笔
联系
管理
聚合
windows 程序解析
//
INCLUDES
//////////////////////////////////////////////
/
#define
WIN32_LEAN_AND_MEAN
//
just say no to MFC
#include
<
windows.h
>
//
include all the windows headers
#include
<
windowsx.h
>
//
include useful macros
#include
<
stdio.h
>
#include
<
math.h
>
//
DEFINES
////////////////////////////////////////////////
//
defines for windows
#define
WINDOW_CLASS_NAME "WINCLASS1"
//
GLOBALS
////////////////////////////////////////////////
//
FUNCTIONS
//////////////////////////////////////////////
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
//
this is the main message handler of the system
PAINTSTRUCT ps;
//
used in WM_PAINT
HDC hdc;
//
handle to a device context
//
what is the message
switch
(msg)
{
case
WM_CREATE:
{
//
do initialization stuff here
//
return success
return
(
0
);
}
break
;
case
WM_PAINT:
{
//
simply validate the window
hdc
=
BeginPaint(hwnd,
&
ps);
//
you would do all your painting here
EndPaint(hwnd,
&
ps);
//
return success
return
(
0
);
}
break
;
case
WM_DESTROY:
{
//
kill the application, this sends a WM_QUIT message
PostQuitMessage(
0
);
//
return success
return
(
0
);
}
break
;
default
:
break
;
}
//
end switch
//
process any messages that we didn't take care of
return
(DefWindowProc(hwnd, msg, wparam, lparam));
}
//
end WinProc
//
WINMAIN
////////////////////////////////////////////////
int
WINAPI WinMain( HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int
ncmdshow)
{
WNDCLASSEX winclass;
//
this will hold the class we create
HWND hwnd;
//
generic window handle
MSG msg;
//
generic message
//
first fill in the window class stucture
winclass.cbSize
=
sizeof
(WNDCLASSEX);
winclass.style
=
CS_DBLCLKS
|
CS_OWNDC
|
CS_HREDRAW
|
CS_VREDRAW;
winclass.lpfnWndProc
=
WindowProc;
winclass.cbClsExtra
=
0
;
winclass.cbWndExtra
=
0
;
winclass.hInstance
=
hinstance;
winclass.hIcon
=
LoadIcon(NULL, IDI_APPLICATION);
winclass.hCursor
=
LoadCursor(NULL, IDC_ARROW);
winclass.hbrBackground
=
(HBRUSH)GetStockObject(BLACK_BRUSH);
winclass.lpszMenuName
=
NULL;
winclass.lpszClassName
=
WINDOW_CLASS_NAME;
winclass.hIconSm
=
LoadIcon(NULL, IDI_APPLICATION);
//
register the window class
if
(
!
RegisterClassEx(
&
winclass))
return
(
0
);
//
create the window
if
(
!
(hwnd
=
CreateWindowEx(NULL,
//
extended style
WINDOW_CLASS_NAME,
//
class
"
Your Basic Window++
"
,
//
title
WS_OVERLAPPEDWINDOW
|
WS_VISIBLE,
0
,
0
,
//
initial x,y
400
,
400
,
//
initial width, height
NULL,
//
handle to parent
NULL,
//
handle to menu
hinstance,
//
instance of this application
NULL)))
//
extra creation parms
return
(
0
);
//
enter main event loop, but this time we use PeekMessage()
//
instead of GetMessage() to retrieve messages
while
(TRUE)
{
//
test if there is a message in queue, if so get it
if
(PeekMessage(
&
msg,NULL,
0
,
0
,PM_REMOVE))
{
//
test if this is a quit
if
(msg.message
==
WM_QUIT)
break
;
//
translate any accelerator keys
TranslateMessage(
&
msg);
//
send the message to the window proc
DispatchMessage(
&
msg);
}
//
end if
//
main game processing goes here
//
Game_Main();
//
or whatever your loop is called
}
//
end while
//
return to Windows like this
return
(msg.wParam);
}
//
end WinMain
一 include头文件和宏定义
#define
WIN32_LEAN_AND_MEAN
//
不使用mfc
#include
<
windows.h
>
//
包含所有的windows头文件,
#include
<
windowsx.h
>
//包含有用的宏定义
二 winmain()函数
int
WINAPI WinMain( HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int
ncmdshow);
函数原型如上,其中hinstance是windows为应用程序生成的句柄,hprevinstance参数现在一般不用,用来向以前的兼容,lpcmdline就相当于dos程序的命令行参数,ncmdshow枚举类型指出如何打开主应用程序窗口,比如最大化,最小化,最前端等
WINAPI 不能少,相当于以前的pascal 关键字
三 WNDCLASSEX 结构
WNDCLASSEX winclass;
//
this will hold the class we create
//
first fill in the window class stucture
winclass.cbSize
=
sizeof
(WNDCLASSEX); //指她本身的大小
winclass.style
=
CS_DBLCLKS
|
CS_OWNDC
|
//窗口样式,一般选这4个
CS_HREDRAW
|
CS_VREDRAW;
winclass.lpfnWndProc
=
WindowProc; //要回调的函数指针
winclass.cbClsExtra
=
0
; //额外的类信息空间,现在一般不用
winclass.cbWndExtra
=
0
; //额外的窗口信息空间,现在一般不用
winclass.hInstance
=
hinstance; //窗口的实例句柄,从winmain()传来
winclass.hIcon
=
LoadIcon(NULL, IDI_APPLICATION); //图标
winclass.hCursor
=
LoadCursor(NULL, IDC_ARROW); //鼠标
winclass.hbrBackground
=
(HBRUSH)GetStockObject(BLACK_BRUSH); //背景刷,用于刷新窗口的画刷句柄,可以用GetStockObject()
winclass.lpszMenuName
=
NULL; //菜单,要加入到窗口中的菜单名称
winclass.lpszClassName
=
WINDOW_CLASS_NAME; //要创建的窗口类的类名
winclass.hIconSm
=
LoadIcon(NULL, IDI_APPLICATION); //图标,显示在标题兰和状态兰
四 注册windows类
RegisterClassEx(
&
winclass); 传入指向类的指针
五 创建窗口
CreateWindowEx(NULL,
//
extended style 扩张的窗口样式,高级,一般不用
WINDOW_CLASS_NAME,
//
class 创建窗口需要的类指针
"
Your Basic Window++
"
,
//
title 标题兰的文本
WS_OVERLAPPEDWINDOW
|
WS_VISIBLE, //窗口样式
0
,
0
,
//
initial x,y 窗口的左上角,象素表示
400
,
400
,
//
initial width, height 宽高,象素表示
NULL,
//
handle to parent 父窗口句柄
NULL,
//
handle to menu 菜单句柄或子窗口标示
hinstance,
//
instance of this application winmain(0中的instance
NULL))
//
extra creation parms 高级参数,一般不用
六 显示窗口且刷新一下
ShowWindow()//可以控制不显示,或在状态兰也不显示
UpdateWindow() //刷新窗口,就是生成一个WM_PAINT消息
七 主消息循环
LRESULT CALLBACK WindowProc(HWND hwnd, //窗口句柄
UINT msg, //消息id
WPARAM wparam, //用于进一步确定msg指定的消息
LPARAM lparam) //用于进一步确定msg指定的消息
LRESULT CALLBACK 不能少,以下是简单的几种消息:
WM_CREATE: //可以此时执行各种初始化
WM_PAINT: hdc
=
BeginPaint(hwnd,
&
ps); //确认窗口是否有效
//
you would do all your painting here
//绘制工作
EndPaint(hwnd,
&
ps); //结束绘制
WM_KEYDOWN: //处理键盘按下
WM_DESTROY: //将要关闭应用程序,发出WM_QUIT消息
WM_QUIT: //推出程序
注意 函数DefWindowProc(),是处理其他的消息,除了WindowProc()已经处理的其他消息.
GetMessage(LPMSG, //消息结构的地址
hWnd, //窗口的句柄
uint, //first message
uint) //last messge
她从事件队列获得下一个消息,然后调用TranslateMessage()函数,进行消息的转换和处理,然后通过DispatchMessage()来调用winproc()函数.
PeekMessage(
&
msg,NULL,
0
,
0
,PM_REMOVE))中参数:消息结构的指针,窗口的句柄,第一条消息,最后一条消息,删除标记 ,其中参数删除标记是GetMessage()中没有的,该标记有2个值,PM_NOREMOVE和PM_REMOVE,前一个经过peekmessage()后不将其从消息队列中删除,后一个表示经过peekmessage()后从消息队列中删除.
Posted on 2006-09-14 15:10
艾凡赫
阅读(591)
评论(0)
编辑
收藏
引用
所属分类:
win32 sdk 编程
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
windows网络编程十九
windows网络编程十七
深入getmessage和peekmessage
windows核心编程--windows程序的执行
windows 程序解析
使用API写Windows程序 (转)
Windows程序的基本结构
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
<
2010年9月
>
日
一
二
三
四
五
六
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(19)
给我留言
查看公开留言
查看私人留言
随笔分类
(12)
ADO(2)
Arithmetic
C/C++(1)
COM
DLL
MFC(4)
NET WORK(1)
ORACLE
OTL
OTL
SQL Server
STL
Thread
traits技术
设计模式
兴致所至(4)
随笔档案
(16)
2008年9月 (1)
2007年1月 (8)
2006年12月 (1)
2006年10月 (1)
2006年3月 (1)
2005年9月 (4)
文章分类
(295)
ADO.NET(1)
ADO编程技术(19)
C++(71)
COM(11)
C语言(5)
DLL 技术(13)
Linux(2)
MFC技术(41)
ORACLE(17)
P2P(7)
SqlServer(9)
win32 sdk 编程(7)
Windows Mobile开发(8)
多线程(8)
共享内存
好 玩(1)
基础知识(16)
加密解密(1)
其 他(2)
设计模式
手机编程
数据库(14)
数据类型(7)
算 法(12)
网络编程(23)
文章档案
(261)
2007年12月 (1)
2007年11月 (3)
2007年9月 (1)
2007年4月 (40)
2007年3月 (4)
2007年1月 (1)
2006年12月 (4)
2006年11月 (15)
2006年10月 (4)
2006年9月 (50)
2006年7月 (1)
2006年4月 (5)
2006年1月 (20)
2005年12月 (47)
2005年11月 (56)
2005年10月 (9)
收藏夹
美文
C#
COM
MFC
【 Visual C++ 教 程 】
MFC 教程
VC编程技巧
VC编程网
VC学习
Web
基础知识
PE文件格式详解
汇编语言
数据结构
网络教学
开发学习
天新网
移动开发网
网络
注册过的论坛网站
最新随笔
1. 麦兜故事
2. 转载--地主与长工
3. 呵呵,还不怎么会用,差点出事
4. 第一次
5. 呵呵!开业大吉!!!
搜索
积分与排名
积分 - 482593
排名 - 42
最新评论
1. re: 哈夫曼编码的源代码[未登录]
有没有联系方式,大神求带,本人qq1984425565,大神求带
--无
2. re: 消除回溯算法的程序实现
设计内容及要求:构造一程序,实现:消除文法每一条产生式候选式的公共左因子。对于用户任意输入的文法G,输出一个无回溯的等价文法,可显示输出,或输出到指定文件中。
--王康
3. re: MFC规则DLL 简单的例子
这个文章是从课本上复制的不?
--张亚成
4. re: _variant_t 到 CString 转换
帮了我一把!拜谢
--苦想者
5. re: ADO连接字符串
评论内容较长,点击标题查看
--BestEssays rewiew
阅读排行榜
1. 使用wxWidgets开发跨平台的GUI程序(转)(4457)
2. CRichEditCtrl (3462)
3. 转载--地主与长工 (2633)
4. VC中自动改变控件位置和大小的对话框类(转)(2195)
5. VC6.0中使用Stream Object读取数据中流文件并显示Bmp,JPG等图片 (转)(1748)
评论排行榜
1. 呵呵!开业大吉!!!(5)
2. 转载--地主与长工 (4)
3. 麦兜故事(1)
4. 第一次(1)
5. 呵呵,还不怎么会用,差点出事(1)