windows程序创建时,需要执行的几个步骤
1.定义WinMain函数;
2.定义窗口处理函数(自定义,处理消息);
3.注册窗口类(向操作系统写入一些数据);
4.创建窗口(内存中创建窗口);
5.显示窗口(绘制窗口的图像)
6.消息循环(获取/翻译/派发消息);。
7.消息处理;
#include
#pragma comment(lib, "winmm.lib") //vs2010需要添加这句话,PlaySound函数才能使用; 如果是在VC++6.0环境中,则需要在链接加入winmm.libLRESULT CALLBACK zcmproc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nCmdShow)
{static TCHAR szAppName[] = TEXT("windows_zcm");HWND hwnd;MSG msg;WNDCLASS wnd;wnd.style = CS_HREDRAW | CS_VREDRAW;wnd.cbClsExtra = 0;wnd.cbWndExtra = 0;wnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wnd.hCursor =LoadCursor(NULL,IDC_ARROW);wnd.hIcon = LoadIcon(NULL,IDI_APPLICATION);wnd.hInstance = hInstance;wnd.lpfnWndProc = zcmproc;wnd.lpszClassName = szAppName;wnd.lpszMenuName = NULL;if(!RegisterClass(&wnd)){MessageBox(NULL,TEXT("注册windows窗口失败"),szAppName,MB_ICONERROR);return 0;}hwnd = CreateWindowEx(0,szAppName,TEXT("Windows API 程序示例"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}LRESULT CALLBACK zcmproc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{HDC hdc;PAINTSTRUCT ps;RECT rect;static TCHAR szMusicTitle[] = TEXT("win98.wav");switch(msg){case WM_CREATE:PlaySound(szMusicTitle,NULL,SND_FILENAME|SND_ASYNC);return 0;case WM_PAINT:hdc = BeginPaint(hwnd,&ps);GetClientRect(hwnd,&rect);DrawText(hdc,TEXT("第一个实验程序!"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);EndPaint(hwnd,&ps);return 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd,msg,wParam,lParam);
}
字符集历史
ASC编码: 7位 128个字符
ASCII编码: 8位 256个字符
DBCS编码: 单双混合编码,英文字符用1个字节,汉字用两个字符
Unicode编码:
utf-8 可变长
utf-16 固定双字节(windows系统使用,英文字符需要补0成双字节)
utf-32 固定四字节
char 每个字符占一个字节
wchar_t 每个字符占两个字节
wchar_t 实际类型为unsigned short,定义时,需要在字符串前增加“L”,通知编译器按照双字节编码字符串,使用Unicode编码(宽字符)
//使用char类型
char* pwzText = "hello zcm";
printf("%s\n",pwzText);
//使用wchar_t类型
wchar_t* pwzText = L"单于张";
wprintf(L"%s\n",pwzText);
在VC中,使用wprintf函数不好用需要换个函数,微软提供了一个在控制台上输出函数的方法WriteConsole
//WriteConsole函数定义
BOOL WINAPI WriteConsole(_In_ HANDLE hConsoleOutput, //控制台缓冲区句柄。要把字符串输出到屏幕上,需要得到一个标准输出的句柄_In_ const VOID *lpBuffer, //字符串缓冲区_In_ DWORD nNumberOfCharsToWrite, //要写入的字符串的长度_Out_opt_ LPDWORD lpNumberOfCharsWritten, //实际写入成功的字符串长度_Reserved_ LPVOID lpReserved //保留参数,备用,必须设置NULL
);
//返回值
//如果函数成功返回非零值,如果函数不成功返回0值。用GetLastError
在这里要说明一下WriteConsole函数输出句柄
GetStdHandle
HANDLE WINAPI GetStdHandle(_In_ DWORD nStdHandle
);
GetStdHandle(STD_INPUT_HANDLE); //返回标准输入设备的句柄,对应标准C语言stdin
GetStdHandle(STD_OUTPUT_HANDLE);//返回标准输出设备的句柄,对应标准C语言stdout
GetStdHandle(STD_ERROR_HANDLE);//返回标准错误设备的句柄,对应标准C语言stderr
//注获取到句柄后不需要释放
将汉字先输入,加工后再输出到控制台
#include
#include
int main()
{TCHAR* szText = TEXT("你好,大爷!");WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),szText,lstrlen(szText),NULL,NULL);getchar();return 0;
}
系统调用函数参数类型说明:
LPSTR ⇒ char*
LPCSTR ⇒ const char*
LPWSTR ⇒ wchar_t*
LPCWSTR ⇒ const wchar_t*
LPTSTR ⇒TCHAR*
LPCTSTR ⇒const TCHAR*
微软定义
#ifdef UNICODE // r_winnt#ifndef _TCHAR_DEFINED
typedef WCHAR TCHAR, *PTCHAR;
typedef WCHAR TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */#define __TEXT(quote) L##quote
下一篇:作业-11.17