Windows Api第一篇

Windows Api是了解windows程序必不可少的一部分

Windows

以前编写的都是dos程序,Windows程序却更贴近windows.

Hello world

新建项目->win32->windows应用程序(空项目)

1
2
3
4
5
6
7
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
MessageBox(NULL, TEXT("Hello, Windows 98!"), TEXT("HelloMsg"), 1);
return 0;
}

参数

int WINAPI WinMain()

1、#include <windows.h>每个用C编写Windows程序的开头都应该包含,主要含入档案。
2、int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
程序的入口点,向main一样,只是Windows叫做WinMain。第一个参数代表执行实体代号,函数定义第三参数个是LPSTR(是16位windows下)。

MessageBox()

显示小视窗,实际上是一个对话框。
参数1:通常是视窗代号
参数2:讯息方块主体中显示的字符串
参数3:标题
参数4:按钮数量(如下图)

Unicode

宽字元

Win32程序中标准字元定义
char c = 'A';
占一个字节,需要一个位的元组存储
char *p
这里p占4个字节
char a[] = "Hello!"
占七个字节(最后加一个0结束),需要七个位的元组存储
Windwos程序标准元定义
typedef unsigned short wchar_t;
这里wchar_t与unsigned short int相同,都是16位元宽,也就是2字节
wchar_t c = 'A';
这时候c=0x0041,虽然’A’是一个字节,但是前面是2字节,编译器会自动扩充,就是Unicode字母A,占2个字节,存储顺序0x41,0x00
wchar_t *p = L'Hello!';
这里有个L(代表[long])。字符串需要14个位元(14个字节),指数p需要4个字节
wchar_t a[] = L'Hello';
这里字符串需要14个位元

宽字元程式

char pc=”Hello!”;
len=strlen(pc);
这时len==6
wchar_t
pw=”Hello!”;
len=strlen(pw);
这时len==1 ????
因为strlen()应该接受char类型的指标,但是却接受unsigned short类型,我们来看看为什么是1
0x0048 0x0065 0x006c 0x006c 0x006d 0x0021
48 00 64 00 6c 00 6c 00 6f 00 21 00
当strlen()遇见0,则表示字符结束。那么怎么办。这时候就出现了wcslen(宽字节长度)。
strlen()函数定义
size_t __cdecl strlen(const char *);
wcslen()函数定义
size_t __cdecl wcslen(const wchar_t *);
如果这时
len=wcslen(pw)
这时len==6
扩展

strlen wcslen
printf wprintf
char TCHAR

L问题

如果定义了_UNICODE识别字,那么一个称作_T的巨集就定义如下

#define __T(x) L##x
_TEXT(“Hello!”)==L”Hello!”
如果没有定义_UNICODE

1
2
#define _T(x) __T(x)
#define _TEXT(x) __T(x)

_TEXT(“Hello!”)==8字节

Windows函数呼叫

MessageBox的两个变形
MessageBoxA

1
WINUSERAPI int WINAPI MessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);

MessageBoxW

1
WINUSERAPI int WINAPI MessageBoxA(HWND hWnd,LPWSTR lpText,LPWSTR lpCaption,UINT uType);

上述而MessageBox也可以

1
2
3
4
5
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif

Windows字符串函式

Windows定义的一组字符串函数式

1
2
3
4
5
6
len = lstrlen(pString);
pString = lstrcpy(pString1,pString2);
pString = lstrcpyn(pString1,pString2,iCount);
pString = lstrcat (pString1, pString2) ;
iComp = lstrcmp (pString1, pString2) ;
iComp = lstrcmpi (pString1, pString2) ;

printf
int printf (const char * szFormat, ...) ;
sprintf()
int sprintf (char * szBuffer, const char * szFormat, ...) ;

1
2
3
4
5
printf ("The sum of %i and %i is %i", 5, 3, 5+3) ;
相等于
char szBuffer [100] ;
sprintf (szBuffer, "The sum of %i and %i is %i", 5, 3, 5+3) ;
puts (szBuffer) ;

视窗和讯息

创建一个自己的视窗
呼叫CreateWindow,先要注册一个视窗类别。

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <windows.h>
#pragma comment(lib, "winmm.lib")
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.lpszMenuNam = 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 name
TEXT("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL); // creation parameters
ShowWindow(hwnd, iCmdShow);//视窗出现在视讯显示器上,函数1, iCmdShow。它确定最初如何在萤幕上显示视窗,是一般大小、 最小化还是最大化。
UpdateWindow(hwnd); //函数2
while (GetMessage(&msg, NULL, 0, 0))
{//讯息回圈
TranslateMessage(&msg); //将 msg 结构传给 Windows,进行一些键盘转换
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//只选择处理三种讯息:WM_CREATE、WM_PAINT 和 WM_DESTROY。
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch (message)//使用 switch 和 case 结构来确定视窗讯息处 理程式接收的是什么讯息,以及如何适当地处理它
{
case WM_CREATE:
PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hdc, TEXT("Hello, Windows 98!"), -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);
}

上面函数至少呼叫了 18 个 Windows 函式。下面以它们在 HELLOWIN 中出现 的次序列出这些函式以及各自的简明描述:

来源:《Windows程序设计》(第五版)

Donate
-------------本文结束感谢您的阅读-------------