随便写点吧,写什么呢,就写一下最近windows编程的一点心得吧。 如有不对的地方还请纠正。提到windows编程就不得不提windowsAPI(s视
窗操作系统应用程序接口),简称winapi , 它是microsoft提供给程序员最方便的和系统内核打交道的接口,它的设计为C和C++程序所调用。
winapi最初的时候只有大约400个左右的函数,但是历经多年的改善,现在已经有上千个,这些函数涵盖了你可以想象到得所有windows方面得应用
比如图形化用户界面,网络服务,图形设备接口等等。早期的windows编程比较繁琐,你不得不去用C去写一些界面出来,随着一些不错的IDE的出现
,像VS, 它大大的简化了开发的难度,使得coder更加的专心于设计,算法,而不是到处的找文档,找出这个或者那个的控件的参数是什么含义,随
着MFC和window Form的出现,基本上是实现了可视化的编程。
废话说了一堆,这里我只是简单的介绍一下使用winapi写一个window应该注意的一些问题。一个windows程序应该包含两个基本元素,一个是
winmain(), 另一个是windowproc(). winmain()很像c语言中的main()函数,它是一个程序的入口点,所有的东西都要在这里调用。
winmain()的
定义如下: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE HpreInstance,LPSTR lpCmdLine,int nCmdShow); 它的返
回
类型是一个整数, 那么后面跟着的WINAPI又是什么意思呢? 它其实是个被定义的宏, 由于winmain()函数是被系统调用的,而windows规定所有
被系统调用的函数必须是采用PASCAL的调用方式--》函数在返回调用者之前将参数从堆栈中删除。winmain()中有四个参数,第一个参数的意思就是
代表了当前正在运行的程序,windows用一些整形数字来识别一些东西,例如正在运行的程序。第二个参数在32位windows系统中已经被抛弃,赋
值为NULL。第三个参数一般是用命令行启动时才需要用,允许你启动程序的时候带一些参数。第四个参数是决定window生成时候的样子,比如最
大化或者最小化。
windowproc()决定了一个window的行为,它负责处理关于windows中的消息。 函数定义如下:
LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wParam, LPARAM lParam);
LRESULT是windows定义的一个类型,相当于C语言中的long.由于windowproc被调用是通过指针,所以呢,一定要保证它是一个可以被
CALLBACK的函数。 HWND是处理由具体的事件所引起的消息,比如拖动窗口。UINT 是用来显示发生消息的类型。至于lparam和wparam具体
传递的信息取决于消息的类型。
昨天晚上睡着了,隔了两天再来写发现思路跟不上了,恩,就把代码发上来吧。
code:
#include<windows.h>
LRESULT WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
HDC hDC;
PAINTSTRUCT PaintSt;
RECT aRect;
switch(message){
case WM_PAINT:
hDC=BeginPaint(hWnd,&PaintSt);
GetClientRect(hWnd,&aRect);
SetBkMode(hDC,TRANSPARENT);
DrawText(
hDC,
L"But,soft!What light through yonder window breaks?",
-1,
&aRect,
DT_SINGLELINE|DT_CENTER|DT_VCENTER
);
EndPaint(hWnd,&PaintSt);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow){
WNDCLASSEX WindowClass;
static LPCTSTR szAppName=L"OFWin";
HWND hWnd;
MSG msg;
WindowClass.cbSize=sizeof(WNDCLASSEX);
WindowClass.style=CS_HREDRAW|CS_VREDRAW;
WindowClass.lpfnWndProc=WindowProc;
WindowClass.cbClsExtra=0;
WindowClass.cbWndExtra=0;
WindowClass.hInstance=hInstance;
WindowClass.hIcon=LoadIcon(0,IDI_APPLICATION);
WindowClass.hCursor=LoadCursor(0,IDC_ARROW);
WindowClass.hbrBackground=static_cast<HBRUSH>(GetStockObject(GRAY_BRUSH));
WindowClass.lpszMenuName=0;
WindowClass.lpszClassName=szAppName;
WindowClass.hIconSm=0;
RegisterClassEx(&WindowClass);
hWnd=CreateWindow(
szAppName,
L"A Basic Window the Hard Way",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
0,
0,
hInstance,
0
);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg,0,0,0)==TRUE)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return static_cast<int>(msg.wParam);
}
编译环境: windowsXP PACK2
VS 2008