按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
MSG msg;
Messages from RegisterClass(。。。);
other windows CreateWindow(。。。);
Mouse Keyboard ShowWindow(。。。);
Driver Driver PostMessage() UpdateWindow(。。。);
while(GetMessage(&msg。。。)) {
TranslateMessage(。。。);
DispatchMessage(。。。);
System Application }
message message return msg。wParam;
queue queue }
Window Procedure
WndProc(hwnd; msg; wParam; lParam)
{
switch (msg) {
case WM_CREATE: 。。。
USER SendMessage() case WM_MAND: 。。。
Module case WM_LBUTTONDOWN: 。。。
case WM_PAINT: 。。。
case WM_CLOSE: 。。。
case WM_DESTROY: 。。。
Windows default: return DefWindowProc(。。。);
}
return(0);
}
图1…2 Windows 程序的本体与操作系统之间的关系。
8
…………………………………………………………Page 71……………………………………………………………
一个具体而微的Win32 程序
许多相关书籍或文章尝试以各种方式简化Windows 程序的第一步,因为单单一个Hello
程序就要上百行,怕把大家吓坏了。我却宁愿各位早一点接触正统写法,早一点看到全
貌。Windows 的东西又多又杂,早一点一窥全貌是很有必要的。而且你会发现,经过有
条理的解释之后,程序代码的多寡其实构不成什么威胁(否则无字天书最适合程序员阅
读)。再说,上百行程序代码哪算得了什么!
你可以从图1…2 得窥Win32 应用程序的本体与操作系统之间的关系。Win32 程序中最
具代表意义的动作已经在该图显示出来,完整的程序代码展示于后。本章后续讨论都围绕
着此一程序。
makefile makefile
稍后会出现一个 。关于 的语法,可能已经不再为大家所熟悉了。我想
我有必要做个说明。
makefile …
所谓 ,就是让你能够设定某个文件和某个文件相比 比较其产生日期。由其比
较结果来决定要不要做某些你所指定的动作。例如:
generic。res : generic。rc generic。h
rc generic。rc
: generic。res generic。rc generic。h
意思就是拿冒号( )左边的 和冒号右边的 和 的文件日
期相比。只要右边任一文件比左边的文件更新,就执行下一行所指定的动作。这动作可
rc generic。rc
以是任何命令列动作,本例为 。
因此,我们就可以把不同文件间的依存关系做一个整理,以makefile 语法描述,以产生
makefile NMAKE。EXE Microsoft MAKE。EXE
必要的编译、联结动作。 必须以 ( 工具)或
Borland MAKE。EXE
( 工具)处理之,或其它编译器套件所附的同等工具(可能也叫做 )
处理之。
9
…………………………………………………………Page 72……………………………………………………………
Generic。mak (请在DOS 窗口中执行nmake generic。mak。环境设定请参考p。224)
#0001 # filename : generic。mak
#0002 # make file for generic。exe (Generic Windows Application)
#0003 # usage : nmake generic。mak (Microsoft C/C++ 9。00) (Visual C++ 2。x)
#0004 # usage : nmake generic。mak (Microsoft C/C++ 10。00) (Visual C++ 4。0)
#0005
#0006 all: generic。exe
#0007
#0008 generic。res : generic。rc generic。h
#0009 rc generic。rc
#0010
#0011 generic。obj : generic。c generic。h
#0012 cl …c …W3 …Gz …D_X86_ …DWIN32 generic。c
#0013
#0014 generic。exe : generic。obj generic。res
#0015 link /MACHINE:I386 …subsystem:windows generic。res generic。obj
#0016 libc。lib kernel32。lib user32。lib gdi32。lib
Generic。h
#0001 //……………………………………………………………………………………………………………………………………………………………………
#0002 // 档名 : generic。h
#0003 //……………………………………………………………………………………………………………………………………………………………………
#0004 BOOL InitApplication(HANDLE);
#0005 BOOL InitInstance(HANDLE; int);
#0006 LRESULT CALLBACK WndProc(HWND; UINT; WPARAM; LPARAM);
#0007 LRESULT CALLBACK About(HWND; UINT; WPARAM; LPARAM);
Generic。c (粗体代表Windows API 函数或宏)
#0001 //……………………………………………………………………………………………………………………………………………………………………
#0002 // Generic Win32 程序的基础写法
#0003 // Top Studio * J。J。Hou
#0004 // 档名 : generic。c
#0005 // 作者 : 侯俊杰
#0006 // 编译联结 : 请参考generic。mak
#0007 //……………………………………………………………………………………………………………………………………………………………………
#0008
#0009 #include // 每一个 Windows 程序都需要包含此档
#0010 #include 〃resource。h〃 // 內含各个 resource IDs
#0011 #include 〃generic。h〃 // 本程序之含入档
#0012
#0013 HINSTANCE _hInst; // Instance handle
#0014 HWND _hWnd;
10
…………………………………………………………Page 73……………………………………………………………
#0015
#0016 char _szAppName'' = 〃Generic〃; //
程序名称
#0017 char _szTitle'' = 〃Generic Sample Application〃; //
窗口标题
#0018
#0019 //……………………………………………………………………………………………………………………………………………………………………
#0020 // WinMain 程序进入点
#0021 //……………………………………………………………………………………………………………………………………………………………………
#0022 int CALLBACK WinMain (HINSTANCE hInstance; HINSTANCE hPrevInstance;
#0023 LPSTR lpCmdLine; int nCmdShow)
#0024 {
#0025 MSG msg;
#0026
#0027 UNREFERENCED_PARAMETER (lpCmdLine); //
避免编译时的警告
#0028
#0029 if (!hPrevInstance)
#0030 if (!Init