Windows程序设计学习笔记2015年10月4日一、宽字符wide-character1、wchar_t: char的双字节(Unicode)定义:typedef unsigned short wchar_t示例:wchar_t c=’A’;wchar_t *pw=L”hello!”; //L(代表long)告诉编译器按宽字符保存,即每个字符占两个字节wchar_t a[]=L”hello!”;2、宽字符库函数wcslen( ):计算宽字串符的长度如:wchar_t *pw=L”hello!”;iLength=wcslen(pw); //字符串长度是6二、windows头文件类型1、CHAR和WCHARtypedef char CHAR; //8位typedef wchar_t WCHAR; //16位变量前面可加wc以说明是一个宽字符2、字符串指针(1)8位字符串指针tpyedef CHAR *PCHAR, *LPCH, *PCH, *NPSTR, *LPSTR, *PSTR;tpyedef CONST CHAR *LPCCH, *PCCH, *LPCSTR, *PCSTR;前缀N和L表示“near”和“long”,指的是16位windows中两种大小不同的指针,在Win32中near和long指针没有区别(2)16位字符串指针tpyedef WCHAR *PWCHAR, *LPWCH, *PWCH, *NWPSTR, *LPWSTR, *PWSTR;tpyedef CONST WCHAR *LPCWCH, *PCWCH, *LPCWSTR, *PCWSTR;3、WINAPI定义:#define WINPAI _stdcall该语句指定了一个调用约定,包括如何生成机器代码以在堆栈中放置函数调用的参数三、Hello程序/*-------------------------------------HELLO.C--windows下显示Hello,world!作者:lw时间:2015年国庆-------------------------------------*/#include <Windows.h>LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow){static TCHAR szAppName[] = TEXT("HelloWin");HWND hwnd;MSG msg;WNDCLASS wndclass;wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = WndProc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = szAppName;if (!RegisterClass(&wndclass)){MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);return 0;}hwnd = CreateWindow(szAppName, //window class nameTEXT("我的windows程序"), //window captionWS_OVERLAPPEDWINDOW, //window styleCW_USEDEFAULT, //initial x positionCW_USEDEFAULT, //initial y positionCW_USEDEFAULT, //initial x sizeCW_USEDEFAULT, //initial y sizeNULL, //parent window handleNULL, //window menu handlehInstance, //program instance handleNULL); //creation parameters ShowWindow(hwnd,iCmdShow);UpdateWindow(hwnd);while (GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;}LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) //窗口过程win prock{HDC hdc;PAINTSTRUCT ps;RECT rect;switch(message){case WM_CREATE:PlaySound(TEXT("A.wma"),NULL,SND_FILENAME | SND_ASYNC);return 0;case WM_PAINT:hdc = BeginPaint(hwnd,&ps);GetClientRect(hwnd,&rect);DrawText(hdc,TEXT("hello,2015国庆!!"),-1,&rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);EndPaint(hwnd,&ps);return 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd,message,wParam,lParam);}注:1、该程序未调用WinProc函数,而是windows调用2、该程序调用的windows函数▲LoadIcon 加载图标供程序使用▲LoadCursor 加载鼠标指针供程序使用▲GetStockObject 获取一个图形对象,在这个例子中,是获取绘制窗口背景的刷子▲RegisterClass 为程序窗口注册窗口类▲MessageBox 显示消息框▲GreateWindow 根据窗口类创建一个窗口▲ UpdateWindow 指示窗口刷新自身▲GetMessage 从消息队列中获取消息▲TranslateMessage 转换某些键盘消息▲DispatchMessage 将消息发送给窗口过程▲PlaySound 播放一个声音文件▲BeginPaint 开始窗口绘制▲GetVlientRect 获取窗口客户区的尺寸▲DrawText 显示文本串▲EndPaint 结束窗口绘制▲PostQuitMessage 在消息队列中插入一条“退出”消息▲DefWindowProc 执行默认的消息处理3、大写标识符(数值常量)前缀+下划线:如CS_HREDRAW前缀类别CS 类风格选项CW 创建窗口选项DT 绘制文本选项IDI 图标ID号IDC 光标ID号MB 消息框选项SND 声音选项WM 窗口消息WS 窗口风格4、新的数据类型▲UNIT:unsigned int(无符号整数)是一个32位的值▲WPARAM和LPARAM 消息响应机制,win16系统遗留下来的产物parametric中的param 参数W:WORD WPARAM 16位无符号整数L:long LPARAM 32位有符号长整形在win32中,WPARAM被定义为一个UINT,扩展到32位,而LPARAM补定义为一个LONG(就是C中的long数据类型),因此这两个参数都是32位的值。
▲4种数据结构结构含义MSG 消息结构WNDCLASS 窗口类结构PINTSTRUCT 绘图结构RECT 矩形结构5、句柄句柄在Windows中使用非常频繁。
句柄是一个数(通常是32位),它代表一个对象。
Windows中的句柄类似传统C或者MS-DOS程序设计中使用的文件句柄。
程序几乎是通过调用Windows函数获取句柄。
程序在其他Windows函数中使用这个句柄,以引用它代表的对象。
句柄的实际值对程序来说是无关紧要的。
但是,向您的程序提供句柄的Windows 模块知道如何使用它来引用相应的对象。
6、匈牙利表示法变量名以一个或者多个小写字母开始,这些字母表示变量的数据类型。
例如szCmdLine 中的sz代表“以0结尾的串”。
常用的变量前缀如下表:前缀数据类型c char或WCHAR或TCHARby BYTE(无符号字符)n shorti intx,y int分别用作x坐标和y坐标cx,cy int分别用作x长度和y长度,c代表“count”b或f BOOL(int);f代表“flang”w WORD(无符号short)l LONG(长整型)dw DWORD(无符号长整型)fn function(函数)s string(串)sz 以0结尾的串h 句柄p 指针。