VC窗口的创建过程
- 格式:doc
- 大小:51.50 KB
- 文档页数:14
MFChierarchy chart(类库列表)MFC与Win321 win32:函数,使用API一步一步搭建应用程序。
(常使用FileView操作)2 MFC编程:实现仍然调用API函数,但是是用类封装API函数,使用向导自动生成应用程序框架。
(常使用ClassView操作)2.1需要掌握的技能2.1.1断点调试2.1.2堆栈调用的查看MFC课程内容1 MFC:MFC的六大机制,文档式架构,常用的MFC类,(10--12)。
2 COM(组件对象模型):COM的原理和应用(6)。
3 ADO/Socket:MFC访问数据库以及一些简单的网络编程。
MFC应用程序编程1 MFC的历史:92(VC1)98(VC6)……………………….2 MFC库基础:2.1 MFC库,微软基础类库。
封装了Windows应用程序编程的各种API以及相关机制的C++类库3 类库的相关头文件件★afx-application framework(应用程序框架x)3.1<stdafx.h>-不是类库头文件,是项目的头文件,称为VC下编译的预编译头文件,用来提高编译速度的。
(*.pch)(头文件是不参加编译的但是他参与生成*.pch)3.2<afxwin.h>-几乎包含了各种常用的MFC有文件3.3 <afxext.h>-提供扩展窗口类的支持(创建工具栏,状态栏等………)MFC应用程序的类型1 支持MFC的控制台应用程序(控制台的第四个选项)1.1 多了一个CWinApp(应用程序类,封装类应用程序启动过沉重所涉及到得相关信息)的全局对象(必须有,而且只能有一个)1.2主函数中多了一个AfxWinInit函数,初始化MFC库中的相关信息2 MFC库程序2.1 MFC支持的静态库2.2 MFC支持的动态库2.2.1 MFC规则库(shared MFC DLL)-可以被各种应用程序调用(非MFC程序,没有MFC类也可以调用)★还是有一个CWinApp派生的CMFC_DLLApp类对象2.2.2 MFC扩展库(using shared MFC DLL)-只能被MFC库所编写的应用程序所调用(对原有的MFC类扩展)★DllMain主函数只能被MFC程序调用3 MFC应用程序-----(注意看父类,子类名字可能不一样)3.1单文档视图应用程序★CWinApp 应用程序类★CAboutDlg(对话框-生成关于窗口-和框架没有任何关系)★CMainFrame(父类是:CFrameWnd)(应用程序主框架窗口类-生成应用程序的主框架-负责各个对象的协调工作)★CDocument(它是父类)(文档类-看不到的很重要-管理数据)★CView(它是父类)(视图类-显示数据并和用户进行交互)★CSingleDocApp(父类是CWinApp)-(使用前面的3个类来创建对象)3.2多文档视图架构★CWinApp 应用程序类★CAboutDlg(对话框-生成关于窗口-和框架没有任何关系)★CView(它是父类)(视图类-显示数据并和用户进行交互)★CDocument(它是父类)(文档类-看不到的很重要-管理数据)★CMDIChildWnd(子框架窗口类,父类)★CMDIFrameWnd(主框架窗口类,父类)我们看到的子窗体其实是★CView和★CMDIChildWnd叠加的3.3基于对话框的应用程序★CWinApp 应用程序类★CDialog(对话框窗口类)★★m_pMainWnd保存主窗口地址DoModal 显示对话框MFC相关类的说明1继承自CObject1.1 CObject类:绝大多数MFC类的父类,提供了MFC库的一些机制1 new/delete操作符,定义了与构造函数相关的内存分配函数2 assert和dump调试,堆调试的支持★3 运行时类信息-属于哪个类,还有类的层次结构★4 动态创建★5 序列化1.2 CWinThread: 线程类。
很多学C的朋友认为C语言只能写DOS程序,而不能像C#那样写windows窗体的程序,这你可就打错特错了,今天我来简单掩饰下C语言怎么利用windows提供出来的API写windows窗体程序。
开发工具VC6.0,开发平台windows7。
首先第一步,打开VC,新建工程,选择win32 application,如下图然后新建一个C语言源文件,这个就不截图了,如果这也不会的话相信你也不会来看这篇帖子~呵呵建好文件以后把一下代码输入进去。
编译即可~代码讲解会下帖子下方1.#include <windows.h>2.3.LRESULT CALLBACK Windo WP roc(4. HWND hwnd, //handle to window5. UINT uMsg, //message identifier6. WPARAM wParam, //first message parameter7. LPARAM lParam //second message parameter8. );9.10.11.int WINAPI WinMain(HINSTANCE hInstance,12. HINSTANCE hPrevInstance,13. L PS TR lpCmdLine,14. int nShowCmd15. )//入口函数16.{17. WNDCLASS wndclass;18. HWND wndhwnd;19. MSG msg;20. wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//加载图标21. wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//加载鼠标样式22. wndclass.style=CS_VREDRAW | CS_HREDRAW;//窗口样式23. wndclass.lpfnWndProc=WindowProc;//窗口过程回调函数24. wndclass.cbClsExtra=0;//类额外内存25. wndclass.cbWndExtra=0;//窗口额外内存26. wndclass.hInstance=hInstance;//27. wndclass.hbrBackground=(HBRUSH)GetStockObject(SYSTEM_FONT);//窗口颜色28. wndclass.lpszMenuName=NULL;//窗口菜单29. wndclass.lpszClassName="testWindow";//窗口类名30.31. RegisterClass(&wndclass);32. wndhwnd=CreateWindow("testWindow","windows",WS_OVERLAPPEDWINDOW& ~WS_MAXIMIZEBOX,33. CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,34. NULL,NULL,hInstance,NULL);35. ShowWindow(wndhwnd,SW_SHOWNORMAL);36. UpdateWindow(wndhwnd);37. while(GetMessage(&msg,NULL,0,0))38. {39. TranslateMessage(&msg);40. DispatchMessage(&msg);41. }42.43. return 0;44.}45.46.LRESULT CALLBACK WindowProc(47. HWND hwnd, //handle to window48. UINT uMsg, //message identifier49. WPARAM wParam, //first message parameter50. LPARAM lParam //second message parameter51. )52.{53. HDC hdc,hDC;54. PAINTSTRUCT ps;55. char szchar[20];56. static int i=0;57. switch (uMsg)58. {59. case WM_PAINT://窗口重绘消息,窗口加载和重绘的时候产生该消息60. hdc=BeginPaint(hwnd,&ps);61. TextOut(hdc,0,0,"窗口加载完成",strlen("窗口加载完成"));//往窗口输出文本62. //MessageBox(hwnd,"Hello World","Hi",MB_OK);63. EndPaint(hwnd,&ps);64.65. break;66. case WM_CHAR://处理键盘按键消息67. sprintf(szchar,"char is %c",wParam);68. MessageBox(hwnd,szchar,"提示",MB_OK);69. break;70. case WM_LBUTTONDOWN://处理鼠标左键按下消息71. MessageBox(hwnd,"mouse click","提示",MB_OK);72. hDC=GetDC(hwnd);73. TextOut(hDC,0,50,"鼠标事件处理时显示文字",strlen("鼠标事件处理时显示文字"));74. ReleaseDC(hwnd,hDC);75. break;76. case WM_CLOSE://窗口关闭消息77. if(IDYES==MessageBox(hwnd,"你确定要关闭吗?","提示",MB_YESNO))78. DestroyWindow(hwnd);79. break;80. case WM_DESTROY:81. PostQuitMessage(0);82. break;83. default:84. return DefWindowProc(hwnd,uMsg,wParam,lParam);//使用缺省值来调用窗口过程函数85. }86. return 0;87.}复制代码要说明的事,windows程序必须包含的头文件就是windows.h,而程序的入口函数叫做WinMain(dos的入口函数叫main),如果搞不清有几个参数,参数怎么写,可以查阅MSDN,WindowProc函数是窗口过程函数,也就是处理窗口消息的函数;先来看winamin函数内部,首先定义了一个WNDCLASS类型的数据,这个类型是windows 提供出来的结构体,他里面有10个成员。
举例说明#include//包含应用程序中数据类型和数据结构的定义long CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//窗口说明//WinMain函数是所有Windows应用程序的入口,类似c语言中的main 函数其功能是完成//一系列的定义和初始化,并产生消息循环/* WinMain函数实现以下功能:注册窗口类,建立窗口及执行其他必要的初始化工作;进入消息循环,根据从应用程序消息队列接受的消息,调用相应的处理过程;当消息循环检测到WM_QUIT消息是终止程序运行WinMain函数有三个基本部分组成:函数说明、初始化和消息循环*/ //函数说明int WINAPI WinMain(HINSTANCE hInstance, // handle to current instanceHINSTANCE hPrevInstance, // handle to previous instanceLPSTR lpCmdLine, // command lineint nCmdShow // show state)//初始化//初始化包括窗口类的定义、注册、创建窗口实例和显示窗口四部分{HWND hwnd;MSG Msg;WNDCLASS wndclass;char lpszClassName[]="窗口";//窗口类名char lpszTitle[]="徐新坡"; //窗口标题名//窗口类定义//窗口类定义了窗口的形式与功能窗口类定义通过给窗口类数据结构WNDCLASS赋值完成//该数据结构中包含窗口类的各种属性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; //窗口类名为“窗口”//////////////// 以下是窗口类的注册 Windows系统本身提供部分预定义的窗口类,程序员也可以自定义窗口类// 窗口类必须先注册后使用if(!RegisterClass(&wndclass)) //如果注册失败发出警告{MessageBeep(0); return FALSE;}///////////////创建窗口创建一个窗口的实例由函数CreateWindow()实现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; //消息循环结束即程序结束时将信息返回系统/////////////窗口函数//窗口函数定义了应用程序对接收到的不同消息的响应,其中包含了应用程序对各种可能接受到的消息的//处理过程,时消息处理分支控制语句的集合long 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);}******************************************************************WinMain()WinMain是一个函数,该函数的功能是被系统调用,作为一个32位应用程序的入口点。
上机考试新版题库-二级C语言程序设计1.5 Visual C++ 2010基本操作这篇文章主要是针对初次接触Visual C++2010的读者,为使他们对Visual C++2010及其基本操作有一个初步的了解,故从界面上主要按钮的功能和基本操作流程两个内容进行说明。
1. Visual C++ 2010操作界面从“开始”—所有程序—Microsoft Visual Studio 2010 Express—Microsoft Visual C++ 2010 Express。
启动后,会进入如图1-8所示的主窗口。
图1-8 Visual C++ 2010主窗口(1)标题栏Visual C++ 2010主窗口的第一行就是标题栏。
标题栏的左边显示当前文件的文件名以及版本信息,默认文件名是“起始页”。
(2)菜单栏标题栏下面依次是菜单栏和工具栏。
各菜单的功能如下:●文件(File):是用来创建、打开、保存项目文件,也是必须要做的第一步;●编辑(Edit):是用来编辑文件;●视图(View):是用来查看代码,显示其他窗口,打开/关闭工具栏;●项目(Project):是用来添加类、添加新项和设置启动项(注意:该项只有在新建项目或打开项目时才会出现);●调试(debug):用来设置项目的各项配置,编译、创建和执行应用程序、调试程序;●工具(Tools):是用来对工具栏、菜单以及集成开发环境进行定制;●窗口(Windows):是用来新建/拆分窗口和窗口布局;●帮助(Help):是给出相关的帮助。
(3)工具栏工具栏和菜单栏的作用是一样的,只不过工具栏是把菜单栏中经常用到的编辑功能选出来并用图形表示,方便我们操作。
Visual C++2010有多个工具栏,常有的有标准工具栏和文本编辑器工具栏。
图1-9所示的就是一个标准工具栏。
图1-9 标准工具栏标准工具栏按钮的功能,各个按钮的功能从左到右分别如下:●创建一个新项目;●添加新项●打开一个已经保存了的文件;●保存当前文件;●保存所有文件;●剪切选定内容到剪切板;●复制选定内容到剪切板;●在当前位置粘贴剪切板中的内容;●撤销上一次操作;●重做被撤销的操作;●启动调试程序;●配置解决方案;●设置解决方案平台;●在文件中查找。
SetWindowRgn,CreateRectRgnIndirect,CreateEllipticRgnIndirect,CreatePolygonRgn,CombineRgnVC++提供了CRgn类和SetWindowRgn()函数来实现不规则的程序窗口。
创建一个不规则窗口的过程是:首先定义一个CRgn类,并用各种初始化函数创建CRgn类的具体区域,然后调用CWnd::SetWindowRgn()函数创建不规则窗口。
CRgn是从CgdiObject衍生出来的类,用来确定一个多边形、椭圆或者由多边形及椭圆合成的范围,在程序中主要会用到CreateRectRgnIndirect()、CreateEllipticRgnIndirect()、CreatePolygonRgn()三个函数。
CreateRectRgnIndirect(LPCRECT lpRect)函数创建一个矩形区域,参数lpRect指定所创建的矩形区域在窗口用户区中的left(左)、top(上)、right(右)、bottom(下)坐标。
例如:CRgn MyRgn;RECT m_rect;m_rect.left=0; m_rect.top=0; m_rect.right=500; m_rect.bottom=300;MyRgn.CreateRectRgnIndirect( &m_rect );CreateEllipticRgnIndirect(LPCRECT lpRect)函数创建一个椭圆形区域,参数lpRect指定所创建的椭圆形区域在窗口用户区中的left(左)、top(上)、right(右)、bottom(下)坐标,如果指定right 坐标与left坐标之差等于bottom坐标与top坐标之差,则创建的区域是一个圆。
例如:CRgn MyRgn;RECT m_rect;m_rect.left=0; m_rect.top=0; m_rect.right=500; m_rect.bottom=300;MyRgn.CreateEllitpticRgnIndirect( &m_rect );CreatePolygonRgn(LPPOINT lpPoints, int nCount, int nMode)函数创建一个多边形区域,参数lpPoints指向一个POINT结构数组,在POINT结构数组中每个POINT结构项,用来确定多边形顶点在窗口用户区中的坐标;nCount说明POINT结构数组中POINT结构项的数目,也就是多边形的顶点数;nMode指定多边形的填充方式,一般使用ALTERNATE方式。
VC创建进程CreateProcess的⽅法本⽂实例讲述了VC创建进程CreateProcess的⽅法。
分享给⼤家供⼤家参考。
具体实现⽅法如下:#include "stdafx.h"#include <windows.h>#include <stdio.h>int main (int argc,char* argv[]){char szCommandLine[]="cmd";STARTUPINFO si={sizeof(si)};PROCESS_INFORMATION pi;si.dwFlags=STARTF_USESHOWWINDOW; //制定wShowWindow成员si.wShowWindow=TRUE; //为真,显⽰进程的主窗⼝BOOL bRet=::CreateProcess(NULL,//不在此指定可执⾏⽂件的⽂件名szCommandLine, //命令⾏参数NULL,//默认进程的安全性NULL,//默认线程的安全性FALSE,//指定当前进程内的句柄不可以被⼦进程继承CREATE_NEW_CONSOLE,//为新进程创建⼀个新的控制台窗⼝NULL,//使⽤本进程的环境变量NULL,//使⽤本进程的驱动器和⽬录&si,&pi);if (bRet){//既然我们不使⽤两个句柄,最好是⽴刻将他们关闭::CloseHandle(pi.hThread);::CloseHandle(pi.hProcess);printf("新的进程的进程ID号:%d\n",pi.dwProcessId);printf("新进程的主线程ID号:%d\n",pi.dwThreadId);}return 0;}希望本⽂所述对⼤家的VC程序设计有所帮助。
第一部分结构化程序设计(可以将C语言程序设计引入此处,新建文件的类型如图1-2中所列,其他操作如同visual c++2008)1.用Visual C++开发第一个简单C程序首先,在磁盘上新建一个文件夹,用于存放C程序,文件夹的名字可以是ex1-1,如 D:\myc\ex1-1。
编程示例,在屏幕上显示一个短句“Hello C World!”.源程序# include 〈stdio.h>void main( ){ printf("Hello C World! \n”);}运行结果Hello C World!作为本书的第一个实验,在Visual C++编程环境下,以上述C语言源程序为例,介绍运行一个C程序的基本步骤,请读者按照以下步骤操作。
1.1 创建工作文件夹,如C:\MYC,如图1。
2所示。
由于开发过程会产生一系列文件,建议每开发一个新的C程序都创建一个工作文件夹。
还可以将所有工作文件夹集中到一起,如C:\myc\EX01—01、C:\myc\EX01-02等等。
图1.2 创建工作文件夹(1)启动VC++执行“开始”—>“程序”—>“Microsoft Visual Studio 6。
0”—〉“Microsoft Visual C++ 6。
0”,进入VC++编程环境(图1。
3).图1。
3 VC++窗口(2)创建工程执行“文件—>新建",弹出“新建"窗口,单击“工程”选项卡,然后在“工程名称(N)”的输入文本框中输入helloc,在“位置(C)”输入框中会自动出现“helloc”子文件夹名称,同时要选中左边框中“win32 console application”以进行“.c”文件的编辑运行等操作(图1.4).图1。
4 创建工程(3)新建文件执行“文件—〉新建”,弹出“新建”窗口,单击“文件"选项卡,然后在“文件名(N)”栏中输入“hello。
博客站点这是第一篇文章通过ADO操作Access数据库»VC++API函数小全VC++/gy8396 发表于2005-10-26, 20:10VC++API小查窗口处理2.1 窗口简介2.2.1 创建普通窗口(CreateWindow、CreateWindowEx)2.2.2 关闭窗口(CloseWindow)2.2.3 销毁窗口(DestroyWindow)2.3 窗口之间的关系2.3.1 父子关系(SetParent、GetParent、IsChild)2.3.2 遍历窗口(EnumWindow、EnumWindowProc、EnumChildWindows、En umChildProc)2.3.3 获取指定的子窗口(ChildWindowFromPoint、ChildWindowFromPointEx) 2.3.4 获得特定的窗口(GetWindow、GetTopWindow、GetNextWindow、GetD esktopWindow)2.4 窗口的大小、位置和布局2.4.1 获取窗口大小(GetWindowRect、GetClientRect)2.4.2 调整窗口大小(AdjustWindowRect、AdjustWindowRectEx)2.4.3 设置和获取窗口位置(SetWindowPos)2.4.4 移动窗口位置(MoveWindow)2.4.5 设置一组窗口位置(BeginDeferWindowPos、DeferWindowPos、EndDefe rWindowPos)2.4.6 设置和获取窗口布局(SetWindowPlacement、GetWindowPlacement) 2.4.7 设置和获得视口坐标起点(SetViewportOrgEx、GetViewportOrgEx)2.4.8 设置和获取视口坐标范围(SetViewportExtEx、GetViewportExtEx)2.4.9 设置和获取窗口坐标起点(SetWindowOrgEx、GetWindowOrgEx)2.4.10 设置和获取窗口坐标范围(SetWindowExtEx、GetWindowExtEx)2.4.11 坐标起点的偏移操作(OffsetViewportOrgEx、OffsetWindowOrgEx) 2.5 显示窗口2.5.1 显示单个窗口(ShowWindow、ShowWindowAsync、OpenIcon)2.5.2 弹出式窗口(ShowOwnedPopups、GetLastActivePopup)2.5.3 显示子窗口(CascadeWindows、TileWindows、ArrangeIconicWindows) 2.5.4 判断各种显示状态(IsIconic、IsWindowVisible、IsZoomed)2.6 窗口属性2.6.1 设置和获取窗口名(SetWindowText、GetWindowText、GetWindowText Length)2.6.2 设置和获取窗口标记长字(SetWindowLong、GetWindowLong)2.6.3 设置和获取前台窗口(SetForegroundWindow、GetForegroundWindow)2.7 对话框2.7.1 创建对话框(DialogBox、CreateDialog、CreateDialogIndirect、Message Box、MessageBoxEx、MessageBoxIndirect)2.7.2 获取控件及其ID(GetDlgItem、GetDlgCtrlID)2.7.3 设置获取控件的显示文本(SetDlgItemText、SetDlgItemInt、GetDlgIte mText、GetDlgItemInt)2.7.4 获取下一个TAB控件(GetNextDlgTabItem)2.7.5 对话框过程(DefDlgProc、DialogProc)2.7.6 对话框坐标和屏幕坐标间的转换(MapDialogRect)2.7.7 撤销对话框(EndDialog)2.8 其他2.8.1 查找窗口(FindWindow、FindWindowEx)2.8.2 设置窗口Z坐标(BringWindowToTop)2.8.3 确定窗口属性(IsWindow、IsWindowUnicode)2.8.4 设置和获取激活态窗口(SetActiveWindow、GetActiveWindow)2.8.5 窗口闪烁(FlashWindow)2.8.6 获取指定点处的窗口(WindowFromPoint)2.8.7 遍历线程所有窗口(EnumThreadWindows、EnumThreadWndProc)设备上下文——DC3.2.1 创建DC(CreateDC、CreateCompatibleDC)3.2.2 撤销DC(ReleaseDC、DeleteDC)3.2.3 获得窗口DC(GetWindowDC、GetDC、GetDCEx)3.2.4 保存和恢复DC(SaveDC、RestoreDC)3.3 设置和获取DC的各种属性3.3.1 获得DC起始点坐标(GetDCOrgEx)3.3.2 设置显示配置(ChangeDisplaySettings、ChangeDisplaySettingsEx) 3.3.3 遍历显示设备和其配置(EnumDisplayDevices、EnumDisplaySettings) 3.3.4 设置和获取DC画刷颜色(SetDCBrushColor、GetDCBrushColor)3.3.5 设置和获取DC画笔颜色(SetDCPenColor、GetDCPenColor)3.3.6 设置和获取DC中各种对象(SelectObject、GetCurrentObject)3.3.7 获取DC中对象的信息(GetObject、GetObjectType、GetStockObject) 3.4 区域操作3.4.1 新建椭圆区域(CreateEllipticRgn、CreateEllipticRgnIndirect)3.4.2 新建多边形区域(CreatePolygonRgn、CreatePolyPolygonRgn)3.4.3 新建矩形区域(CreateRectRgn、CreateRectRgnIndirect)3.4.4 新建圆矩形区域(CreateRoundRectRgn)3.4.5 区域之间的操作(EqualRgn、ExcludeUpdateRgn)3.4.6 区域上绘图操作(FillRgn、FrameRgn、InvertRgn、PaintRgn)3.5 裁剪操作3.5.1 设置和获取裁剪区域(SelectClipRgn、SelectClipPath、GetClipRgn、Ext SelectClipRgn)3.5.2 裁剪区域间的运算(ExcludeClipRect、IntersectClipRect、OffsetClipRgn) 3.6 坐标变换3.6.1 客户区坐标与屏幕坐标的变换(ClientToScreen、ScreenToClient)3.6.2 设备坐标与逻辑坐标的变换(DPtoLP、LPtoDP)3.6.3 窗口间的坐标变换(MapWindowPoints)3.7 颜色和调色板3.7.1 创建新调色板(CreatePalette)3.7.2 启用调色板(SelectPalette、RealizePalette)3.7.3 设置和获取调色板颜色条目(SetPaletteEntries、GetPaletteEntries)3.7.4 设置系统调色板的工作方式(SetSystemPaletteUse)3.7.5 设置和获取颜色调整(SetColorAdjutstment、GetColorAdjustment)3.7.6 获取匹配颜色(GetNearestColor、GetNearestPaletteIndex)3.8 其他3.8.1 滚动窗口(ScrollDC)3.8.2 偏移操作(OffsetRect、OffsetRgn)3.8.3 点、矩形和区域的关系(PtInRegion、PtVisible、RectInRegion、RectVisi ble)3.8.4 缩放视口和窗口大小(ScaleViewportExtEx、ScaleWindowExtEx)3.8.5 由给定DC获取相联系的窗口(WindowFromDC)3.8.6 获取特定设备的信息(GetDeviceCaps)3.8.7 撤销DC中的对象(DeleteObject)基本画图函数4.1.1 点(SetPixel、SetPixelV、GetPixel)4.1.2 线(LineTo、LineDDA、LineDDAProc、MoveToEx、Polyline、PolylineT o)4.1.3 曲线(PolyBezier、PolyBezierTo、PolyDraw)4.1.4 弧(AngleArc、Arc、ArcTo、SetArcDirection、GetArcDirection)4.1.5 椭圆(Ellipse)4.1.6 弦(Chord)4.1.7 矩形(Rectangle、Roundrect、DrawEdge、DrawFocusRect、FillRect) 4.1.8 多边形(Polygon、PolyPolygon、PolyPolyline)4.1.9 饼图(Pie)4.2 路径相关函数4.2.1 启动和终止路径绘图(BeginPath、EndPath)4.2.2 曲线到直线(FlattenPath)4.2.3 填充路径(FillPath、StrokeAndFillPath)4.2.4 边界处理(StrokePath、WidenPath)4.2.5 封闭路径(CloseFigure)4.2.6 获取路径区域(PathToRegion)4.2.7 获取路径(GetPath)4.2.8 撤销路径(AbortPath)处理DC对象4.3.1 新建画笔(CreatePen、CreatePenIndirect、ExtCreatePen)4.3.2 新建画刷(CreateBrushIndirect、CreateHatchBrush、CreateDIBPatter nBrushPt、CreatePatternBrush、CreateSolidBrush、GetSysColorBrush) 4.3.3 设置和获取背景颜色和模式(GetBkColor、GetBkMode、SetBkColor、Set BkMode)4.4 图元文件4.4.1 创建图元文件(CreateEnhMetaFile、CreateMetaFile)4.4.2 复制图元文件(CopyEnhMetaFile、CopyMetaFile)4.4.3 打开图元文件(GetEnhMetaFile)4.4.4 关闭图元文件(CloseEnhMetaFile、CloseMetaFile)4.4.5 撤销图元文件(DeleteEnhMetaFile、DeleteMetaFile)4.4.6 绘制图元文件(PlayEnhMetaFile)4.5 其他4.5.1 启动和终止绘图(BeginPaint、EndPaint)4.5.2 获取需更新区域(GetUpdateRect、GetUpdateRgn)4.5.3 绘图操作生效(InvalidateRect、InvalidateRgn、ValidateRect、Validate Rgn)4.5.4 设置和获取最大绘图缓冲(GdiSetBatchLimit、GdiGetBatchLimit)4.5.5 刷新缓冲(GdiFlush)4.5.6 设置和获取窗口可绘图区域(SetWindowRgn、GetWindowRgn)4.5.7 禁止在窗口绘图(LockWindowUpdate)4.5.8 绘制桌面(PaintDesktop)4.5.9 更新窗口(RedrawWindow)4.5.10 撤销绘图操作(CancelDC)4.5.11 描绘标准控件(DrawFrameControl)4.5.12 设定画图效果(DrawState、DrawStateProc)4.5.13 设置和获取系统颜色(SetSysColors、GetSysColor)位图和图标5.2.1 创建位图(CreateBitmap、CreateBitampIndirect、CreateCompatible、Bitmap、CreateDIBitmap、CreateDIBSection、LoadBitmap、LoadImage) 5.2.2 创建图标(CreateIcon、LoadIcon、LoadCursorFromFile)5.2.3 撤销图标(DestoryIcon)5.3 设置和获得位图和图标的各种属性5.3.1 设置和获取位图的位数据(SetBitmapBits、GetBitmapBits)5.3.2 设置和获取DIB(SetDIBits、GetDIBits)5.3.3 设置和获取DIB颜色表(SetDIBColorTable、GetDIBColorTable)5.3.4 设置和获取位图的大小(GetBitmapDimensionEx、SetBitmapDimension Ex)5.3.5 获取图标信息(GetIconInfo)5.4 位块操作5.4.1 各种位块操作方式(BitBlt、PatBlt、PlgBlt、StretchBlt、MaskBlt、Trans parentBlt)5.4.2 设置和获取位操作模式(SetROP2、GetROP2、SetStretchBltMode、GetS tretchBltMode)5.5 其他5.5.1 复制位图和图标(CopyImage、CopyIcon)5.5.2 从文件中搜寻图标(ExtractIcon、ExtractIconEx、ExtractAssociatedIcon) 5.5.3 显示图标(DrawIcon、DrawIconEx)菜单处理6.1 菜单的简单操作6.1.1 生成新菜单(CreateMenu、CreatePopupMenu)6.1.2 装载菜单(LoadMenu、LoadMenuIndirect)6.1.3 撤销菜单(DestoryMenu、DeleteMenu、RemoveMenu)6.1.4 获取菜单(GetMenu、GetSubMenu、GetSystemMenu)6.1.5 增添菜单(AppendMenu)6.2 菜单项处理6.2.1 设置和获取菜单项信息(SetMenuItemInfo、GetMenuItemInfo)6.2.2 设置和获取缺省菜单项(SetMenuDefautlItem、GetMenuDefaultItem) 6.2.3 获取菜单项的ID(GetMenuItemID)6.2.4 获取菜单项数(GetMenuItemCount)6.2.5 获取菜单项的范围大小(GetMenuItemRect)6.2.6 高亮显示菜单项(HiliteMenuItem)6.2.7 菜单项属性(CheckMenuItem、EnableMenuItem、CheckMenuRadioIte m)6.2.8 添加菜单项(InsertMenuItem)6.2.9 获取某点处的菜单项(MenuItemFromPoint)6.3 其他6.3.1 设置窗口的菜单(SetMenu)6.3.2 判定句柄是否指向菜单(IsMenu)6.3.3 上下文菜单(TrackPopupMenu、TrackPopupMenuEx)6.3.4 显示菜单条(DrawMenuBar)6.3.5 图形菜单项(SetMenuItemBitmaps)文件处理7.1 创建、读写和撤销文件7.1.1 创建文件(CreateFile、lcreat、GetTempFileName)7.1.2 设置文件读写位置(SetFilePointer、_llseek、_lseek)7.1.3 写入文件(WriteFile、lwrite、hwirte)7.1.4 异步写入文件(WriteFileEx、FileIOCompletionRoutine)7.1.5 读入文件(ReadFile、_lread、_hread)7.1.6 异步读入文件(ReadFileEx)7.1.7 复制文件(CopyFile、CopyFileEx、CopyProgressRoutine)7.1.8 更改文件名(MoveFile、MoveFileEx)7.1.9 关闭文件(CloseHandle、_lclose)7.1.10 删除文件(DeleteFile)7.2 设置和获得文件的各种信息7.2.1 获取文件大小(GetFileSize)7.2.2 获取文件类型(GetFileType)7.2.3 设置和获取文件时间信息(SetFileTime、GetFileTime)7.2.4 获取文件版本信息(GetFileVersionInfo、GetFileVersionInfoSize、VerQu eryValue)7.2.5 是否可执行文件(GetBinaryType)7.2.6 长文件名和短文件名的转换(GetFullPathName、GetShortPathName) 7.2.7 由文件句柄获取文件信息(GetFileInformationByHandle)7.2.8 设置文件结束标志(SetEndOfFile)7.2.9 设置和获取文件属性(SetFileAttributes、GetFileAttributes)7.3 目录处理7.3.1 创建新目录(CreateDirectory、CreateDirectoryEx)7.3.2 删除目录(RemoveDirectory)7.3.3 获取系统路径(GetSystemDirectory)7.3.4 获取临时路径(GetTempPath)7.3.5 获取Windows完整目录(GetWindowsDirectory)7.3.6 设置和获取当前目录(SetCurrentDirectory、GetCurrentDirectory)7.4 文件查找7.4.1 查找第一个文件(FindFirstFile)7.4.2 查找下一个文件(FindNextFile)7.4.3 查找指定文件(SearchPath)7.4.4 查找结束(FindClose)7.5 磁盘信息7.5.1 获取可用逻辑驱动器(GetLogicalDrives)7.5.2 获取可用逻辑驱动器信息(GetLogicalDriveStrings)7.5.3 设置和获取卷标信息(SetVolumeLabel、GetVolumeInformation)7.5.4 获取磁盘空闲空间(GetDiskFreeSpace、GetDiskFreeSpaceEx)7.5.5 获取磁盘类型(GetDriveType)7.6 压缩文件7.6.1 初始化内部缓冲区(LZInit)7.6.2 打开压缩文件(LZOpenFile)7.6.3 读入压缩文件(LZRead)7.6.4 压缩文件指针定位(LZSeek)7.6.5 获取压缩文件大小(GetCompressedFileSize)7.6.6 获取压缩文件全名(GetExpandedName)7.6.7 复制和解压缩文件(LZCopy)7.6.8 关闭压缩文件(LZClose)7.7 其他7.7.1 设置和获取字符集(SetFileApisToANSI、SetFileApisToOEM、AreFileApi sANSI)7.7.2 联系文件和I/O端口(CreateIoCompletionPort、PostQueuedCompletion Status、GetQueuedCompletionStatus)7.7.3 更新文件缓冲区(FlushFileBuffers)7.7.4 加锁和解锁文件(LockFile、LockFileEx、UnlockFile、UnlockFileEx)7.7.5 撤销文件IO(CancelIO)7.7.6 比较文件时间信息(CompareFileTime)7.7.7 设备IO操作(DeviceIoControl)7.7.8 DOS时间转换为Win32时间(DosDateTimeToFileTime)7.7.9 Win32时间转换为Dos时间(FileTimeToDosDateTime)7.7.10 Win32时间转换本地时间(FileTimeToLocalFileTime)同步8.1 同步对象8.1.1 生成同步对象(CreateEvent、CreateMutex、CreateSemaphore、Create WaitableTimer)8.1.2 打开同步对象(OpenEvent、OpenMutex、OpenSemaphore、OpenWait able Timer)8.1.3 关键段(EnterCriticalSection、LeaveCriticalSection、DeleteCritiaclSec tion)8.2 关键区段8.2.1 初始化关键区段(InitializeCriticalSection、InitializeCriticalSectionAnd SpinCount)8.2.2 非阻塞进入关键区段(TryEnterCriticalSection)8.2.3 设置关键区段的计数(SetCriticalSecitonSpinCount)8.3 原子性访问变量8.3.1 原子性比较(InterlockedCompareExchange)8.3.2 原子性交换(InterlockedExchange)8.3.3 原子性增加(InterlockedIncrement、InterlockedExchangeAdd)8.3.4 原子性减少(InterlockedDecrement)8.4 等待事件发生8.4.1 触发一个事件并等待另一个事件(SignalObjectAndWait)8.4.2 等待单个事件发生(WaitForSingleObject、WaitForSingleObjectEx)8.4.3 等待多个事件发生(WaitForMultipleObjects、WaitForMultipleObjectsEx) 8.4.4 等待消息(MsgWaitForMultipleObjects、MsgWaitForMultipleObjectsEx) 8.5 其他8.5.1 设置事件状态(SetEvent、ResetEvent、PulseEvent)8.5.2 释放互斥量(ReleaseMutex)8.5.3 释放信号灯(ReleaseSemaphore)8.5.4 设置可等待定时器状态(SetWaitableTimer、CancelWaitableTimer)处理文本和字体9.1 文本9.1.1 显示文本(DrawText、DrawTextEx、TextOut、ExTextOut、TabbedText Out、GrayString、OutputProc、PolyTextOut)9.1.2 设置和获取文本属性(SetTextAlign、GetTextAlign、SetTextColor、GetT extColor)9.1.3 调整和获取字符间距(SetTextCharacterExtra、GetKerningPairs)9.1.4 获得字符串的宽和高(GetTextExtentPoint32、GetTabbedTextExtent) 9.1.5 获取字符串的信息(GetCharacterPlacement)9.1.6 调整字符串(SetTextJustification)9.3 字体9.3.1 创建新字体(CreateFont、CreateFontIndirect、CreateScalableFontRes ource)9.3.2 在系统中添加和删除字体(AddFontResource、RemoveFontResource) 9.3.3 获取字体的宽度(GetCharABCWidths、GetCharWidth、GetCharWidth32、GetCharWidthFloat、GetCharaABCWidthsFloat)9.3.4 获取字体的各种信息(GetTextMetric、GetFontLanguageInfo)9.3.5 字体的宽高比( GetAspectRatioFilterEx、SetMapperFlags)9.3.6 获取字体的字型名(GetTextFace)9.3.7 遍历系统字体(EnumFontFamiliesEx、EnumFontFamiExProc)第10章硬件和系统10.1 键盘10.1.1 设置和获取键盘布局(ActivateKeyboardLayout、GetKeyboardLayout、GetKey boardLayoutList、GetKeyboardLayoutName)10.1.2 装载和卸载键盘布局(LoadKeyBoardLayout、UnloadKeyBoardLayout) 10.1.3 获得和设置键盘状态(GetKeyboardState、SetKeyboardState)10.1.4 获得键盘类型(GetKeyboardType)10.1.5 获得按键名(GetKeyNameText)10.1.6 获得按键状态(GetKeyState、GetAsyncKeyState)10.1.7 虚拟按键到扫描码(MapVirtualKey、MapVirtualKeyEx)10.1.8 虚拟按键到ASCII码(ToAscii、ToAsciiEx)10.1.9 虚拟按键到Unicode(ToUnicode、ToUnicodeEx)10.1.10 字符到虚拟按键(VkKeyScan、VkKeyScanEx)10.1.11 OEM码到扫描码(OemKeyScan)10.1.12 注册和撤销系统热键(RegisterHotKey、UnregisterHotKey)10.1.13 插入键盘事件(SendInput、keybd_event)10.2 鼠标10.2.1 获得鼠标输入点序列(GetMouseMovePoints)10.2.2 获得和设置双击间隔(GetDoubleClickTime、SetDoubleClickTime) 10.2.3 鼠标左右键设置(SwapMouseButton)10.2.4 鼠标捕获和释放(SetCapture、GetCapture、ReleaseCapture)10.2.5 捕获离开和滑过事件(TrackMouseEvent)10.2.6 插入鼠标事件(mouse_event)10.2.7 探测拖动(DragDetect)10.3 光标10.3.1 新建和撤销光标(CreateCursor、LoadCursorFromFile、DestroyCursor) 10.3.2 设置和获取光标(SetCursor、GetCursor)10.3.3 设置和获取光标位置(SetCursorPos、GetCursorPos)10.3.4 设置和获取光标活动范围(ClipCursor、GetClipCursor)10.3.5 显示光标(ShowCursor)10.3.6 设置系统光标(SetSystemCursor)10.4 时钟10.4.1 设置和获取系统时间(SetSystemTime、GetSystemTime、GetSystemTi meAsFileTime)10.4.2 设置和获取当地时间(SetLocAltime、GetLocAltime)10.4.3 获取自启动以来的微秒数(GetTickCount)10.4.4 获取和设置系统调整时间( GetSystemTimeAdjustment、SetSystemTi meAdjustment)10.4.5 设置和获取时区信息(SetTimeZoneInformation、GetTimeZoneInforma tion)10.4.6 获取高精度时间(QueryPerformanceCounter、QueryPerformance Fre quency)10.4.7 设置定时器(SetTimer)10.4.8 设置定时器回调函数(TimerProc)10.4.9 撤销定时器(KillTimer)10.5 系统信息10.5.1 获取系统各种度量信息(GetSystemMetrics)10.5.2 设置和获取系统参数(SystemParametersInfo)10.5.3 确定处理器的特性(IsProcessorFeaturePresent)10.5.4 获取和设置计算机名(GetComputerName、SetComputerName)10.5.5 获取用户名(GetUserName)10.5.6 获取操作系统版本信息(GetVersionEx)10.5.7 获取系统信息(GetSystemInfo)第11章Windows 消息11.1 消息系统概述11.2 消息处理11.2.1 发送消息(SendMessage、SendMessageCallback、SendNotifyMessage、SendMessageTimeout、PostThreadMessage、PostMessage、PostQutiMe ssage、BroadcastSystemMessage)11.2.2 回复消息(ReplyMessage)11.2.3 获取消息(GetMessage、WaitMessage、PeekMessage)11.2.4 处理消息(TranslateMessage、DispatchMessage)11.2.5 设置和获取消息的附加信息(SetMessageExtraInfo、GetMessageExtra Info)11.2.6 获取消息的伴随信息(GetMessagePos、GetMessageTime)11.2.7 注册新窗口消息(RegisterWindowMessage)11.3 消息队列11.3.1 获取队列状态(GetQueueStatus)11.3.2 获取队列中输入消息状态( GetInputState)11.4 其他11.4.1 是否重入(InSendMessage、InSendMessageEx)进程和线程12.1 进程和线程概述12.2 进程12.2.1 创建新进程(CreateProcess、CreateProcessAsUser)12.2.2 获取进程对象(OpenProcess)12.2.3 获取进程起始信息(GetStartupInfo)12.2.4 设置和获取工作集大小(SetProcessWorkingSetSize、GetProcessWorki ngSetSize)12.2.5 设置和获取进程的优先级(SetPriorityClass、GetPriorityClass)12.2.6 进程的动态优先级(SetProcessPriorityBoost、GetProcessPriorityBoost) 12.2.7 设置和获取退出参数(SetProcessShutdownParameters、GetProcessSh utdownParameters)12.2.8 获取进程的退出代码(GetExitCodeProcess)12.2.9 设置和获取环境参数(GetEnvironmentStrings、SetEnvironmentVariable、GetEnvironmentVariable、FreeEnvironmentVariable)12.2.10 获取进程的时间信息(GetProcessTime)12.2.11 获取进程的版本信息(GetProcessVersion)12.2.12 获取当前进程(GetCurrentProcess、GetCurrentProcessID)12.2.13 等待进程空闲(WaitForInputIdle)12.2.14 结束进程(ExitProcess、TerminateProcess)12.2.15 获取命令参数(GetCommandLine、CommandLineToArgvW)12.3 线程12.3.1 创建新线程(CreateThread)12.3.2 设置和获得线程优先级(SetThreadPriority、GetThreadProority)12.3.3 线程的调度(SuspendThread、SwitchToThread、ResumeThreadExitT hread 、TerminateThread、Sleep、SleepEx)12.3.4 设置线程的输入队列(AttachThreadInput)12.3.5 线程的动态优先级( SetThreadPriorityBoost、GetThreadPriorityBoost)12.3.6 获取线程的时间信息(GetThreadTimes)12.3.7 获取线程的退出码(GetExitCodeThread)12.4 调试12.4.1 调试指定进程(DebugActiveProcess)12.4.2 设置断点(DebugBreak)12.4.3 等待异常发生(WaitForDebugEvent)12.4.4 重新启动线程(ContinueDebugEvent)12.4.5 设置调试级别(SetDebugErrorLevel)12.4.6 发送一串字符给调试器(OutputDebugString)12.4.7 是否处于被调试态(IsDebuggerPresent)12.4.8 控制转移到调试器(FatalExit)12.4.9 设置和获取线程上下文(SetThreadContext、GetThreadContext) 12.4.10 获取线程选择子的描述符(GetThreadSelectorEntry)12.4.11 读写进程内存(WriteProcessMemory、ReadProcessMemory) 12.5 线程局部数据区12.5.1 分配(TlsAlloc)12.5.2 释放(TlsFree)12.5.3 设置和获取变量值(TlsSetValue、TlsGetValue)12.6 进程间通信12.6.1 创建映射文件(CreateFileMapping)12.6.2 打开映射文件(OpenFileMapping)12.6.3 映射文件到内存(MapViewOfFile、MapViewOfFileEx)12.6.4 撤销映射(UnmapViewOfFile)。
如何在VC++6.0中创建、编译、链接、运行一个C程序2010-12-04 17:26:21| 分类:VC编程| 标签:如图对话框弹出编译单击|字号大中小订阅(1)启动VC++6.0 (如图1)图1(2)创建一个C程序:①单击“File”——单击“New”,会弹出一个窗口(如图2),--选win32 console application --填写工程名并选择放置工程的位置-------确定------在弹出的窗口中选“一个空工程”(an empty project)-----确定。
图2②选择“Files”选项卡,再选中“C++ Sourse File”(如图3)图3③在“Location”栏目中设置存放位置。
方式一:直接输入存放路径,如d:yongsailigaofeng;方式二:单击右侧省略号按钮“”,弹出“Choose Directory”对话框(如图4)进行设置,设置完后单击“OK”即可。
图4④在如图3的对话框中,在“File”栏目中输入文件名*.c(如以1.c为例,注:此时一定要带上.c,否则扩展名就变成了.cpp)。
④设置完后单击“OK”即可。
⑤编辑一个C程序内容后保存(如图5),此时就完成了一个C文件的创建。
图5(3)编译:单击编译按钮“” (或者Ctrl+F7),会弹出如图6的对话框,图6此时选择“是(Y)”创建一个默认project workspace。
编译成功后,会生成1.obj目标文件,出现如图7的提示:图7(4)链接:单击链接按钮“” (或者F7),会弹出如图8的对话框,链接成功后,会生成1.exe的可执行文件,出现如图8的提示:图8(5)运行:单击运行按钮“” (或者Ctrl+F5),会弹出如图9的对话框,图9(6)关闭工作区:①按任意键返回;②单击“File”——单击“Close Workspace”(如图10)。
图10(结束)评论这张转发至微博转发至微博0人 | 分享到:阅读(1070)| 评论(1)| 引用(0) |举报用VC编译C程序学习编程应该学习的语言历史上的今天∙[转]23岁以后的你,一定要看看哦2008-12-04 18:54:15相关文章∙鼠标单击操作教案2009-11-26 09:11:10∙解析Win XP的“单击锁定”功能2007-06-10 15:15:18∙360单击游戏中心诺顿2010简体中文版2010-08-25 22:56:03。
VC++窗口的创建过程在Windows中运行的程序,大多数都有一个或几个可以看得见的窗口,而在这些窗口被创建起来之前,操作系统怎么知道该怎样创建该窗口,以及用户操作该窗口的各种消息交给谁处理呢?所以VC在调用Windows的API(CreateWindow或者CreateWindowEx)创建窗口之前,要求程序员必须定义一个窗口类(不是传统C++意义上的类)来规定所创建该窗口所需要的各种信息,主要包括:窗口的消息处理函数、窗口的风格、图标、鼠标、菜单等。
其定义如下:typedef struct tagWNDCLASSA(注:该结构为ANSII版本){UINT style;WNDPROC lpfnWndProc;int cbClsExtra ;int cbWndExtra ;HINSTANCE hInstance ;HICON hIcon ;HCURSOR hCursor ;HBRUSH hbrBackground ;LPCSTR lpszMenuName ;LPCSTR lpszClassName ;}WNDCLASSA, * PWNDCLASSA, NEAR * NPWNDCLASSA, FAR * LPWNDCLASSA ;style 表示该类窗口的风格,如style = CS_VREDRAW|CS_HREDRAW表示窗口在运动或者调整大小时需要重画,关于其它风格可在 MSDN中查到。
lpfnWndProc为一指针,指向用户定义的该窗口的消息处理函数。
cbClsExtra 用于在窗口类结构中保留一定空间,用于存在自己需要的某些信息。
cbWndExtra用于在Windows内部保存的窗口结构中保留一定空间。
hInstance 表示创建该窗口的程序的运行实体代号(WinMain的参数之一)。
hIcon、hCursor、hbrBackground、lpszMenuName分别表示该窗口的图标、鼠标形状、背景色以及菜单。
lpszClassName表示该窗口类别的名称,即标识该窗口类的标志。
从上面可以看出一个窗口类就对应一个WNDCLASSA结构(这里以ANSII为例),当程序员将该结构按自己要求填写完成后,就可以调用RegisterClass(或RegisterClassEx)函数将该类注册,这样以后凡是要创建该窗口,只需要以该类名(lpszClassName中指定)为参数调用CreateWindow,你看多方便呀,真是一举多得啊!总结:窗口结构注册(调用RegisterClass(或RegisterClassEx)函数)后,以后凡是要创建该窗口,只需要以该类名(lpszClassName中指定)为参数调用CreateWindow。
二、传统SDK中的窗口类既然我们知道了什么是窗口类,那我们就将它放到一个传统的SDK程序中,看看是怎样运行的。
#include <windows.h>LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){static TCHAR szAppName[] = TEXT ("HelloWin") ;WNDCLAS 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 ;RegisterClass (&wndclass);hwnd = CreateWindow( szAppName, // window class nameTEXT ("The Hello Program"), // window captionWS_OVERLAPPEDWINDOW, // window styleCW_USEDEFAULT, // initial x positionCW_USEDEFAULT, // initial y positionCW_USEDEFAULT, // initial x sizeCW_USEDEFAULT, // initial y sizeNULL, // parent window handleNULL, // window menu handlehInstance, // program instance handleNULL); // creation parametersShowWindow (hwnd, iCmdShow) ;UpdateWindow (hwnd) ;while (GetMessage (&msg, NULL, 0, 0)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}return msg.wParam ;}这是一个标准的Windows程序代码,程序被启动后,填写一个窗口类,然后调用RegisterClass 将该类注册,接着创建该窗口,最后显示窗口和进入消息循环。
三、MFC中的窗口类当你看到这里,也许你可能会感到奇怪:我在用MFC向导做程序时,并没有进行什么窗口类的填写和注册吗?是的,你没有,但是向导帮你做了。
在展示向导是怎么做的之前,请让我先介绍一下预先知识。
在MFC系统中定义了五个默认的窗口类(这里不包括AFX_WNDCOMMCTLS_REG),分别定义在AFXIMPL.h中:#define AFX_WND_REG (0x0001)#define AFX_WNDCONTROLBAR_REG (0x0002)#define AFX_WNDMDIFRAME_REG (0x0004)#define AFX_WNDFRAMEORVIEW_REG (0x0008)#define AFX_WNDDOLECONTROL_REG (0x0020)在WINCORE.cpp定义了这些窗口类对应的字符串名称:const TCHAR _afxWnd[] = AFX_WND;const TCHAR _afxWndControlBar[] = AFX_WNDCONTROLBAR;const TCHAR _afxWndMDIFrame[] = AFX_WNDMDIFRAME;const TCHAR _afxWndFrameOrView[] = AFX_WNDFRAMEORVIEW;const TCHAR _afxWndOleControl[] = AFX_WNDOLERONTROL;在AFXIMPL.h中定义了五个AFX_XXX对应的字符串:#define AFX_WND AFX_WNDCLASS("WND")#define AFX_WNDCONTROLBAR AFX_WNDCLASS("ControlBar")#define AFX_WNDMDIFRAME AFX_WNDCLASS("MDIFrame")#define AFX_WNDFRAMEORVIEW AFX_WNDCLASS("FrameOrView")#define AFX_WNDOLECONTROL AFX_WNDCLASS("OleControl")看到这里也许有些心急了,其实上面一堆代码只是定义了五个默认窗口类的字符串名称和二进制名称,具体注册行为在全局函数AfxDeferRegisterClass中:#define AfxDeferRegisterClass(fClass) \((afxRegisteredClasses & fClass) ? TRUE:AfxEndDeferRegisterClass(fClass) #define afxRegisteredClasses AfxGetModuleState()->m_fRegisteredClassesBOOL AFXAPI AfxEndDeferRegisterClass(short fClass){WNDCLASS wndCls;wndCls.lpfnWndProc = DefWindowProc;if(fClass & AFX_WND_REG){wndCls.lpszClassName=_afxWnd;AfxRegisterClass(&wndCls);}else if(fClass & AFX_WNDOLECONTROL_REG){wndCls.lpszClassName=_afxWndOleControl;AfxRegisterClass(&wndCls);}else if(fClass & AFX_WNDCONTROLBAR_REG){wndCls.lpszClassName=_afxWndControlBar;AfxRegisterClass(&wndCls);}else if(fClass & AFX_WNDMDIFRAME_REG){RegisterWithIcon(&wndCls,_afxWndMDIFrame,AFX_IDI_MDIFRAME);}else if(fClass & AFX_WNDFRAMEORVIEW_REG){RegisterWithIcon(&wndCls,_afxWndFrameOrView,AFX_IDI_STD_FRAME);}else if(fClass & AFX_WNDCOMMCTLS_REG){InitCommonControls();}}从以上例子可以看出, AfxDeferRegisterClass函数用if/else结构实现各种不同窗口的注册,所以MFC函数窗口注册的时候调用AfxDeferRegisterClass函数就可以了。