学习 VC之前 需要具备一定得C/C++编程能力 由于陌生函数 和新知识点很多 要有充分的心理准备 和坚持不懈的精神 只要肯坚持
绝对能有很大的收获 万事开头难啊
以下是学习中 自己理解的一些基本概念:
消息:操作系统用来通知应用程序执行相应功能的一种结构体.
句柄:资源的标识。操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源.
HINSTANCE 一般是窗口实例句柄
LPARAM 低位标识鼠标的X坐标,坐标是相对于左上角的客服区
高位标识鼠标的Y坐标,坐标是相对于左上角的客服区
我们可以这样获得一个鼠标的坐标
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
<<<注意包含头文件 #include <windowsx.h> >>>>
还可以这样获得鼠标的坐标
POINT pt;
GetCursorPos(&pt);
还可以
POINT pt;
pt.x=LOWORD(lParam);
pt.y=HIWORD(lParam);
WPARAM 指示各种虚拟键是否被按下,这可能是一个或多个键的组合。
我们可以直接使用WPARAM获得用户按下的键的ASCII码
我们在WM_CHAR消息中添加代码:
char szChar[20];
sprintf(szChar,"char code is %d",wParam);
MessageBox(hwnd,szChar,"char",0);
就可以知道用户按下键的ASCII码了。
LPSTR实质是:
typedef char CHAR;
typedef CHAR *LPSTR,*PSTR ;
创建一个窗口应用程序的过程如下:
定义窗口类(即设计)
注册窗口类
创建窗口
显示及更新窗口
以下是自己写的一个非窗口程序,基本是最简了:
#include "stdafx.h"
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
/*自定义的窗口处理函数声明 此函数要遵守一定的规则
LRSULT CALLBACK表示这个函数是用作系统调用的 我们没必要显式调用
函数名我们可是随便定义 但参数和返回值类型要遵守这种规则
*/
//---------------------------------------一下初始化窗口---------------------------------------
/*WinMain函数为程序入口
这里我们几个应用程序入口函数:
1.需要ANSI字符和字符串的GUI应用程序
int WINAPI winMain(HINSTANCE hinstExe,HINSTANCE,
PATR pszCmdLine,int nCmdShow);
(嵌入可执行文件的启动函数:WinMainCRTStartup)
2.需要Unicode字符和字符串的GUI应用程序
int WINAPT wWinMain(HINSTANCE hinstExe,HINSTANCE,
PATR pszCmdLine,int nCmdShow);
(w)WinMain的hinstExe参数的实际值是系统将可执行文件的映像加载到地址空间是使用的基本地址空间。例如,如果系统打开了
可执行文件并且将它的内容加载到地址0x00400000中,那么(w)WinMain的hinstExe参数的值就是0x00400000.
(嵌入可执行文件的启动函数:WinMainCRTStartup)
3.需要ANSI字符和字符串的CUI应用程序
int _cdecl main(int argc,char *argv[],char *envp[]);
(嵌入可执行文件的启动函数:mainCRTStartup)
4.需要Unicode字符和字符串的CUI应用程序
int _cdecl wmain(int argc,wchar_t *argv[],wchar_t *envp[]);
(嵌入可执行文件的启动函数:wmainCRTStartup);
参考资料:<<Windows 核心编程>>
*/
int APIENTRY WinMain(HINSTANCE hInstance,//窗口实例句柄 由系统分配 供我们使用
HINSTANCE hPrevInstance,//当前窗口的上一窗口的实力句柄 我们一般不会用到这个参数
LPSTR lpCmdLine,//命令行参数 函数运行时我们所给与的启动参数
int nCmdShow)//指明窗口如何显示 有很多可用的标志 详细参见MSDN
{
HWND hwnd;//用来保存我们所创建的窗口的句柄
MSG msg;//消息结构体
WNDCLASS wndclass;//窗口类
char lpszClassName[]="窗口";//窗口类名称
char lpszTitle[]="My_Windows";//窗口名称
//定义窗口类
wndclass.style=0;//窗口类型为默认
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=lpszClassName;//定义窗口类名
//----------------------------------以下注册窗口-----------------------------------------
RegisterClass(&wndclass);
//----------------------------------创建窗口-----------------------------------------
hwnd=CreateWindow(//返回创建的窗口句柄
lpszClassName,
lpszTitle,
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 WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
switch(message)//判断消息类型
{
case WM_DESTROY://销毁窗口消息
PostQuitMessage(0);//退出 窗口
default:
return DefWindowProc(hwnd,message,wParam,lParam);//用户每处理的消息 调用系统默认的处理
}
return(0);
}