跟着孙鑫VC视频学习,需要比较深入的学习windowSDK编程吗?
不是说想学习VC/MFC 就要比较深入的了解windowSDK编程吗。。
但是我只是会 ,设计类。注册类,创建类,显示类。。消息循环。
就是最最最基础的SDK代码
我就只有这种水平,,学习VC 会比较辛苦吗??
是否还要加强学习SDK呢。。
请高手帮忙啊!!!
不是说想学习VC/MFC 就要比较深入的了解windowSDK编程吗。。
但是我只是会 ,设计类。注册类,创建类,显示类。。消息循环。
就是最最最基础的SDK代码
我就只有这种水平,,学习VC 会比较辛苦吗??
是否还要加强学习SDK呢。。
请高手帮忙啊!!!
解决方案 »
- recvfrom接收不到数据,求解
- 请教OnReceive后回调其调用类的方法?
- 关于activex web控件的重绘问题
- GetCurrentDirectory使用的参数0,NULL,难以理解
- 请教精通TCP/IP协议的大虾!
- Combo Box控件如何设置内容可选,但不可手动输入其它字符
- 如何设置CFileDialog使之打开文件时只显示bmp文件
- 在OpenGL中,如何让三维卫星在绕地球运行时轴线在轨道线上?
- 关于网络监视器捕获ICMP包的问题
- 如何正确使用多文件打开对话框?
- Edit编辑框如何响应Ctrl+A事件?
- 求颜色算法:随机生成两个RGB颜色,一个做前景色一个做背景色,要求不刺眼、且对比清晰。
一个窗体类存储了以下信息:
窗体类型,控制这个窗体的程序(回调函数),小图标大图标,背景染色,指定这个窗体属于哪个实例(属于哪个进程),窗体的菜单栏等。
那么存储这些消息的结构是哪个呢:就是他拉WNDCLAS***(**表示扩展风格)存储了注册一个窗体所需要填写的各个属性。
*NDCLAS*** wc;
wc.cbSize = sizeof(WNDCLAS***);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbCl***tra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if(!RegisterClas***(&wc))
{
MessageBox(NULL, "Window Registration Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
当我们填写好了各个成员变量后就可以调用RegisterClas***进行注册咯。
这段代码我们在WinMain()中注册我们的窗体类,下面解释一下WNDCLAS***各个成员的意思。
cbSize
WNDCLAS***的大小,固定的sizeof(WNDCLAS***);因为要分配内存!所以需要指定,否则你的窗体会那么安稳的在屏幕上显示吗?
style
风格类型具体的看MSDN也可以为空
lpfnWndProc
为该窗体指定一个处理过程
cbCl***tra
为该类型在内存中分配额外数据数量,通常为空或默认。
cbWndExtra
在每个该类型窗体中分配额外数据数量。通常为空或默认。
hInstance
程序的实例(说明该类型窗体属于那个进程的)通常这个我们设置为WinMain()中的主进程实例(主窗口嘛!)
hIcon
大图(通常为32*32的ICON格式图表)标。当用户按Alt+Tab的时候显示的那个图标
hCursor
当鼠标在我们的窗体范围内的时候要显示的鼠标(默认为系统当前鼠标)
hbrBackground
设置我们该窗体类型的背景颜色
lpszMenuName
在我们的窗体中所使用的菜单资源名称
lpszClassName
标示该类型的名称
hIconSm
小图标(通常为16*16的ICON格式文件)。会显示在任务栏和窗体的左上角
2. 第二步创建窗口
当窗体注册后我们就可以调用CreateWindowEx创建该类型的窗体了
HWND hwnd;
hwnd = CreateWindowEx(
W*_**_CLIENTEDGE,
g_szClassName,
"The title of my window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
NULL, NULL, hInstance, NULL);
参数1 W*_**_CLIENTEDGE 扩展的窗体风格,这样我们就设置了向凹陷的边框。关于其它风格在MSDN中有具体的说明在这里就不多说了因为(真的很多)。
参数2 g_szClassName我们拥有的类型名称,告诉系统你需要创建一个何种类型的窗体。既然我们想创建我们刚刚注册的类型窗体,那么我就指定该类型的名称(唉!中文真的很难描述这个步骤。)
之后的参数为我们窗体的标题
参数3 参数4 指定左上角坐标
参数5 参数6 指定右下角坐标
参数7 指定父窗口如果没有为NULL
参数8 要使用的菜单句柄
参数9 这个就不用多说了吧!我自己都嫌烦了
参数10 这个还是先在稍微说明一下吧!如果我能写完的话这个参数会在MDI部分讲解。这个参数指向一个传递给窗体的数值通过WM_CREATE 的lpParam参数中的CREATESTRUCT结构。也可以NULL。
3. 第三步消息循环
由于该方法创建的时一个模式窗体所以需要一个消息循环否则我们的这个窗体一闪而过。并且这部分是整个程序的核心,几乎windows程序中所作每件事都是通过这部分控制的。
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
GetMessage从程序的消息队列中获得一个消息。任何时候用户点击鼠标移动鼠标,点击菜单,按下键盘上任何一个按键或做其它事情,系统都会产生消息并进入你的程序的消息队列。通过调用GetMessage()可以请求到下一个可以使用的消息,之后该消息就会从消息队列中移出被你的程序所处理。
TranslateMessage做一些额外的处理。如键盘处理。键盘事件类似产生附和着WM_KEYDOWN消息的WM_CHAR消息。
DispatchMessage会将该window产生的消息转发出去