1.API和DSK
Windows操作系统提供了各种各样的函数,以方便我们开发windows应用程序。这些函数是windows操作系统提供给应用程序编程的接口(Application Programming Interface),就是我们通常所说的API函数。所有主要的windows函数都在windows.h头文件中进行了声明。
SDK的全称是SoftwareDevelopment Kit,中文译名为软件开发包,包括了API函数、帮助文档、微软提供的一些辅助开发工具等。
2.窗口和句柄
一个应用程序窗口通常包含标题栏、菜单栏、系统菜单、最小化框、最大化框、可调边框等。窗口按功能又可以分为客户区和非客户区两部分。其中客户区时窗口的主要部分,程序员通常在客户区中完成编辑文字,绘制图形等需要实现的功能;而非客户区主要由windows系统来管理,用户可以根据自己需求做适当的修改。对话框和消息框是两种常见的窗口,在对话框上有很多空间,如:按钮、静态文本框、组框、编辑框、单选按钮、复选框等。
在windows应用程序中,窗口是通过窗口句柄(HWND)来标识的。在具体的应用程序编程时,我们要对某个窗口进行操作,首先就要得到这个窗口的句柄。
3.事件驱动机制
Windows程序设计时一种基于事件驱动方式的程序设计模式,主要是基于消息的。每一个windows应用程序开始执行后,系统都会为该程序创建一个消息队列,用来存放该程序创建的窗口消息。Windows将产生的消息依次放到消息队列中,而应用程序通过一个消息循环不断从消息队列中取出消息,并进行响应,这种消息机制就是windows程序运行及机制。
Windows程序中的消息可以分为“进队消息”和“不进队消息”。进队消息由系统放入到应用程序消息队列中,然后由应用程序取出并发送。不进队消息在系统调用窗口过程时直接发送给窗口。
4.WinMain函数
当windows操作系统启动一个程序时,它调用的就是该程序的WinMain函数。WinMain函数是windows程序的入口点函数,当WinMain函数结束或返回时,windows应用程序结束。
5应用举例
对于一个完整的Win32应用程序,该程序实现的功能时创建一个窗口,并在窗口中响应键盘和鼠标消息,将其具体实现步骤如下:
1)WinMain将函数的定义。
2)窗口的创建。具体又可以分为以下4个步骤:
·设计一个窗口类;
·注册窗口类;
·创建窗口;
·显示及更新窗口 。
3)进行消息循环。
4)编写窗口过程函数,处理发送给窗口的消息。
下面是具体的代码(仅供参考)
#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WinSunProc( HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam );
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
//设计一个窗口类
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 = "zmj";
wndcls.lpszMenuName = NULL;
wndcls.style = CS_HREDRAW | CS_VREDRAW;
//注册窗口类
RegisterClass(&wndcls);
//创建窗口
HWND hwnd;
hwnd = CreateWindow("zmj", "http://www.zmj.org",
WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL);
//显示及刷新窗口
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);
//定义消息结构体,开始消息循环
MSG msg;
BOOL bRet;
while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
{
if(bRet == -1)
return -1;
else
{
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[20];
sprintf(szChar, "char code is %d", wParam);
MessageBox(hwnd, szChar, "char", 0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd, "mouse clicked", "message", 0);
HDC hdc;
hdc = GetDC(hwnd);
TextOut(hdc, 0, 50, "Microsoft Visual Studio", strlen("Microsoft Visual Studio"));
//ReleaseDC(hwnd, hdc);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC = BeginPaint(hwnd, &ps);
TextOut(hDC, 0, 0, "http://www.zmj. org", strlen("http://www.zmj. org"));
EndPaint(hwnd, &ps);
break;
case WM_CLOSE:
if(IDYES == MessageBox(hwnd, "Are you sure to exit ?", "message", MB_YESNO))
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}