Win32项目—用C语言写的。。。
#include<windows.h>
#include "stdio.h"
/*
1.定义入口函数winMain()
2.创建一个窗口
A.设计窗口类WNDCLASS(给成员变量赋值)
B.注册窗口类
C.创建窗口类
D.显示和更新窗口 显示和更新窗口 可以看文档 MSDN winAPI MFC 参考中文文档
3.消息循环
4.窗口过程函数
*/
//对于VS2010 使用F12查看某个参数
//WinAPI是一个修饰函数,告诉参数入栈方式,是从右往左进行的,而且函数调用结束后自动清理堆栈
//CALLBACK也是同样的道理
LRESULT CALLBACK DealMessage (HWND hWnd,//窗口句柄,消息的所属窗口
UINT uMsg,//消息标志
WPARAM wParam,//附加信息
LPARAM lParam)
{
// LPPAINTSTRUCT ps;//绘图结构体//
PAINTSTRUCT ps;//为什么定义这个而不是上面那个
HDC dc;
//char *p = "AAAAAAA";
TCHAR* p = L"AAAAAAAAAAAAA";//luanma 乱码关于字符集的问题;;; 转换宽字节;宽字节:一个字符两个字节//L 宽字节
switch(uMsg)
{
case WM_LBUTTONDOWN:
MessageBox(hWnd,TEXT("ABC"),TEXT("鼠标左键按下"),MB_OK);//
break;
case WM_PAINT:
{
// LPPAINTSTRUCT ps;//绘图结构体 fang kaitou
dc = BeginPaint(hWnd,&ps);//zai chuangkou shangmian
// TextOut(dc,20,20,p,strlen(p));//int c = strlen()
TextOut(dc,20,20,p,wcslen(p));//宽字节de 长度
EndPaint(hWnd,&ps);//END
break;
}
case WM_DESTROY:
PostQuitMessage(2);//2 WM_QUIT 给主函数传递 return uMsg.wParam
break;
default:
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance,//应用程序实例
HINSTANCE hPreInstance,//上一个应用程序实例
LPSTR lCmdLine,//命令行参数//LPSTR:为 long pointer string 长整型字符串指针 相当于 char* 为什么用long,兼并不同操作系统有的32 64位
int nCmdShow)//窗口显示的方式:默认最大化,最小化等
{
HWND hWnd;//????定义必须放在最前面
MSG msg;//??????
//A设计窗口类:给窗口类成员赋值
WNDCLASS wc;
wc.cbClsExtra = 0;//类的附加信息,可不写
wc.cbWndExtra = 0;//窗口的附加信息
//获取系统默认的白色画刷
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//背景色,必须写
//wc.hCursor = NULL;//采用默认光标
wc.hCursor = LoadCursor(NULL,IDC_HELP);//不采用默认光标,采用一个标准的箭头和问号//第一个参数是应用程序的实例,用NULL就是采用默认的;参数二:光标的名字,见百度或者帮助
//wc.hIcon = NULL;//图标//采用默认图标
wc.hIcon = LoadIcon(NULL,IDI_WARNING);//加载系统图标 警告模式
wc.hInstance = hInstance;//应用程序的实例
wc.lpfnWndProc = DealMessage;//窗口过程函数名字,消息处理函数
wc.lpszClassName = TEXT("ABC");//类的名字、、字符集 用TEXT或者其他
wc.lpszMenuName = NULL;//菜单名字//空,或者默认
wc.style = nCmdShow;//显示风格
//B注册窗口类:告诉系统窗口过程函数的入口地址
RegisterClass(&wc);
//C创建窗口类:
// HWND hWnd;//?????
hWnd = CreateWindow(TEXT("ABC"), TEXT("hello windows"), WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance, NULL);
if(!hWnd)
return 0;
//D显示和更新窗口
ShowWindow(hWnd,SW_NORMAL);// SW_NORMAL nCmdShow
UpdateWindow(hWnd);
//x消息循环
//接收到WM_QUIT就退出,返回0 ;出错返回-1
while(GetMessage(&msg,NULL,0,0))
{
//翻译工作
//虚拟按键转为标准字符WM_CHAR
TranslateMessage(&msg);
//给操作系统分发消息
DispatchMessage(&msg);
}
//待续--2018.10.29 23:38 ZWJ
return 1;
}
总结【总结】
- WinMain中 关于 HWND 和 MSG的定义必须放在此函数的开始处
- MessageBox()的参数,看提示信息
int MessageBox(
HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType
);
3.在CALLBACK中 输出时字符呈现乱码,则是关于字符集的问题,需要转换为宽字符(一个字符两个字节),用TCHAR定义宽字符,大写 L 表示 是宽字节。。。。。同时,字符串长度得用wcslen来计算,不是strlen
TCHAR* p = L"AAAAAAAAAAAAA";//luanma 乱码关于字符集的问题;;; 转换宽字节;宽字节:一个字符两个字节//L 宽字节
4.在switch 中 如果case 块中内容过多,则用{break;} 说明这个是一起的 - 窗口类 wc. lpszClassName必须与CreateWindow中窗口类的名字相同,否则窗口会出现不了,CreateWindow 创建的句柄是空的。