VC----编程基础
2016-08-18 17:40
78 查看
Windows编程的结构。Windows编程由两个主要函数:主函数和窗口函数。
//设计Windows程序必须包含的头文件
#include <afxwin.h>
//定义全局变量--------------------------
HINSTANCE hInstance;
HWND hWnd;
MSG msg;
char lpszClassname[]="窗口";
char *ShowText;
//定义函数-----------------------------
ATOM MyRegisterClass(HINSTANCE hInstance); //注册窗口类函数
BOOL Create(HINSTANCE,int); //程序实例 初始化 函数
int Run(); //消息循环 函数
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); // 窗口函数
//主函数-----------------------------
int APIENTRY WinMain(HINSTANCE hInstance,HIN
4000
STANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
MyRegisterClass(hInstance); //在主函数中定义窗口类函数
Create(hInstance,nCmdShow); //创建窗口
ShowWindow(hWnd,nCmdShow); //显示窗口
UpdateWindow(hWnd); //更新屏幕显示
return Run(); //消息循环
}
//注册窗口类的 函数实现----------------------
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASS wc;
wc.style=0;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName=lpszClassname;
return RegisterClass(&wc);
}
//创建窗口函数 的实现-----------------------
BOOL Create(HINSTANCE hInstance,int nCmdShow)
{
hWnd=CreateWindow(lpszClassname,"Windows",WS_OVERLAPPEDWINDOW,
10,10,800,600,NULL,NULL,hInstance,NULL);
return TRUE;
}
//消息循环函数 的实现-----------------------
int Run()
{
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//窗口函数 的实现---------------------------
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch(message)
{
case WM_LBUTTONDOWN:
ShowText="Hello!";
InvalidateRect(hWnd,NULL,1);
break;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
TextOut(hdc,50,50,ShowText,6);
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}
// ----------------------------- The end of the program -----------------------------
[align=right]
[/align]
对VC编程基础(1)的主程序进行分析后,就会知道,主函数的任务就是 注册(MyRegisterClass(hInstance)),创建(Create(hInstance,nCmdShow))并显示窗体(ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); )而且 实现消息循环(Run())。如果用面向对象的思想来考虑,主函数的函数体可以看成一个对象-应用程序类对象,而其中的窗体应该是应该是嵌入在这个应用程序类对象中的另一个对象。。。。。因此,为了形成应用程序框架,应该声明两个类:应用程序类和窗体类。也就是说,应用程序类和窗体类
分别与 主函数和窗体函数 相对应。。。
一窗体类的封装
窗体类应该具有窗体类的 定义、注册、创建和显示 等功能。同时在类中应该有一个HWND类型的窗口句柄hWnd,作为类的数据成员。 因此,窗体类只要把窗口句柄与对窗口操作的API函数封装到一起就可以了..........
//窗体类的声明
class CFrameWnd
{
public:
HWND hWnd;
public:
int RegisterWindow(); //注册函数
void Create(LPCTSTR lpClassName, LPCTSTR lpWindowName); //创建窗体函数
void ShowWindow(int nCmdShow);
void UpdateWindow();
};
//窗体类的成员函数--------------------------
int CFrameWnd::RegisterWindow()
{
WNDCLASS wc; // 定义窗口类结构 对象wc
wc.style=0;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName=lpszClassname;
return RegisterClass(&wc); // 实现 窗口类的注册
}
void CFrameWnd::Create(LPCTSTR lpClassName, LPCTSTR lpWindowName)
{
RegisterWindow();
hInst=hInstance;
hWnd=CreateWindow(lpszClassname,lpWindowName,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,0,CW_USEDEFAULT,0,
NULL,NULL,hInstance,NULL);
}
void CFrameWnd::ShowWindow(int nCmdShow)
{
::ShowWindow(hWnd,nCmdShow);
}
void CFrameWnd::UpdateWindow()
{
::UpdateWindow(hWnd);
}
//--------------------------------
通过上面 分析,然后再与 VC编程基础(1) 的程序中的前面部分比较,你就会理解MFC的类的封装过程。。
支持(0)反对(0)
上面讲了窗体类CFrameWnd 的封装,下面讲一下应用程序类CWinApp的封装,这两个类是构成Windows应用程序开发 必须用到的 两个类!!
二 应用程序类的封装
在一个应用程序类中,至少应该有一个窗体类的对象m_pMainWnd 作为CWinApp类的 数据成员。
同时在CWinApp类中,还应该有成员函数InitInstance(初始化函数) 和Run(消息循环函数) 这两个基本函数。
在成员函数InitInstance中 要创建窗体对象m_pMainWnd,因为 只有创建了窗体类对象,CWinApp类才能和 窗体类CFrameWnd 建立联系。。。也就是说,m_pMainWnd对象 是它们的联系纽带。。创建窗体对象m_pMainWnd以后,通过它就可以调用窗体类的成员函数。
上面的这段说明 很重要得!可以更好的理解下面的程序。
//应用程序类的声明
class CWinApp
{
public:
CFrameWnd* m_pMainWnd;
public:
BOOL InitInstance(int nCmdShow);
int Run();
};
//应用程序类的 成员函数 实现
BOOL CWinApp:nitInstance(int nCmdShow)
{
m_pMainWnd=new CFrameWnd; //前面只是一个声明,也就是只是一个定义,
// 而此处是为m_pMainWnd变量赋值。使其具有真正的内容。。
m_pMainWnd->Create(NULL,"封装的windows应用程序"); //创建窗口,可以看一下上次的窗体类封装
// 里面的Create函数,就会理解他的调用过程
m_pMainWnd->ShowWindow(nCmdShow); //
m_pMainWnd->UpdateWindow(); //
return TRUE;
}
int CWinApp::Run()
{
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//------------------------------------------------------------
Run()函数是一个消息成员函数。系统为程序建立了叫做消息队列的一个存储空间,在程序的运行过程中,如果发生了一个事件,Windows就会把这个事件所对应的消息送入消息队列等待使用。而应用程序为了取得队列中的消息,就会调用Windows提供的一个API函数GetMessage,并利用这个函数的返回值(当获得消息时,返回TRUE,否则,返回FALSE)组织一个循环来不断获取消息队列中的消息,一旦获得消息,就把这个消息送给系统,即DispatchMessage(&msg)函数。而TranslateMessage(&msg)是把
键盘消息 翻译成字符消息。
//---------------------------------
//设计Windows程序必须包含的头文件
#include <afxwin.h>
//定义全局变量--------------------------
HINSTANCE hInstance;
HWND hWnd;
MSG msg;
char lpszClassname[]="窗口";
char *ShowText;
//定义函数-----------------------------
ATOM MyRegisterClass(HINSTANCE hInstance); //注册窗口类函数
BOOL Create(HINSTANCE,int); //程序实例 初始化 函数
int Run(); //消息循环 函数
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); // 窗口函数
//主函数-----------------------------
int APIENTRY WinMain(HINSTANCE hInstance,HIN
4000
STANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
MyRegisterClass(hInstance); //在主函数中定义窗口类函数
Create(hInstance,nCmdShow); //创建窗口
ShowWindow(hWnd,nCmdShow); //显示窗口
UpdateWindow(hWnd); //更新屏幕显示
return Run(); //消息循环
}
//注册窗口类的 函数实现----------------------
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASS wc;
wc.style=0;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName=lpszClassname;
return RegisterClass(&wc);
}
//创建窗口函数 的实现-----------------------
BOOL Create(HINSTANCE hInstance,int nCmdShow)
{
hWnd=CreateWindow(lpszClassname,"Windows",WS_OVERLAPPEDWINDOW,
10,10,800,600,NULL,NULL,hInstance,NULL);
return TRUE;
}
//消息循环函数 的实现-----------------------
int Run()
{
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//窗口函数 的实现---------------------------
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch(message)
{
case WM_LBUTTONDOWN:
ShowText="Hello!";
InvalidateRect(hWnd,NULL,1);
break;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
TextOut(hdc,50,50,ShowText,6);
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}
// ----------------------------- The end of the program -----------------------------
[align=right]
[/align]
对VC编程基础(1)的主程序进行分析后,就会知道,主函数的任务就是 注册(MyRegisterClass(hInstance)),创建(Create(hInstance,nCmdShow))并显示窗体(ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); )而且 实现消息循环(Run())。如果用面向对象的思想来考虑,主函数的函数体可以看成一个对象-应用程序类对象,而其中的窗体应该是应该是嵌入在这个应用程序类对象中的另一个对象。。。。。因此,为了形成应用程序框架,应该声明两个类:应用程序类和窗体类。也就是说,应用程序类和窗体类
分别与 主函数和窗体函数 相对应。。。
一窗体类的封装
窗体类应该具有窗体类的 定义、注册、创建和显示 等功能。同时在类中应该有一个HWND类型的窗口句柄hWnd,作为类的数据成员。 因此,窗体类只要把窗口句柄与对窗口操作的API函数封装到一起就可以了..........
//窗体类的声明
class CFrameWnd
{
public:
HWND hWnd;
public:
int RegisterWindow(); //注册函数
void Create(LPCTSTR lpClassName, LPCTSTR lpWindowName); //创建窗体函数
void ShowWindow(int nCmdShow);
void UpdateWindow();
};
//窗体类的成员函数--------------------------
int CFrameWnd::RegisterWindow()
{
WNDCLASS wc; // 定义窗口类结构 对象wc
wc.style=0;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName=lpszClassname;
return RegisterClass(&wc); // 实现 窗口类的注册
}
void CFrameWnd::Create(LPCTSTR lpClassName, LPCTSTR lpWindowName)
{
RegisterWindow();
hInst=hInstance;
hWnd=CreateWindow(lpszClassname,lpWindowName,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,0,CW_USEDEFAULT,0,
NULL,NULL,hInstance,NULL);
}
void CFrameWnd::ShowWindow(int nCmdShow)
{
::ShowWindow(hWnd,nCmdShow);
}
void CFrameWnd::UpdateWindow()
{
::UpdateWindow(hWnd);
}
//--------------------------------
通过上面 分析,然后再与 VC编程基础(1) 的程序中的前面部分比较,你就会理解MFC的类的封装过程。。
支持(0)反对(0)
二 应用程序类的封装
在一个应用程序类中,至少应该有一个窗体类的对象m_pMainWnd 作为CWinApp类的 数据成员。
同时在CWinApp类中,还应该有成员函数InitInstance(初始化函数) 和Run(消息循环函数) 这两个基本函数。
在成员函数InitInstance中 要创建窗体对象m_pMainWnd,因为 只有创建了窗体类对象,CWinApp类才能和 窗体类CFrameWnd 建立联系。。。也就是说,m_pMainWnd对象 是它们的联系纽带。。创建窗体对象m_pMainWnd以后,通过它就可以调用窗体类的成员函数。
上面的这段说明 很重要得!可以更好的理解下面的程序。
//应用程序类的声明
class CWinApp
{
public:
CFrameWnd* m_pMainWnd;
public:
BOOL InitInstance(int nCmdShow);
int Run();
};
//应用程序类的 成员函数 实现
BOOL CWinApp:nitInstance(int nCmdShow)
{
m_pMainWnd=new CFrameWnd; //前面只是一个声明,也就是只是一个定义,
// 而此处是为m_pMainWnd变量赋值。使其具有真正的内容。。
m_pMainWnd->Create(NULL,"封装的windows应用程序"); //创建窗口,可以看一下上次的窗体类封装
// 里面的Create函数,就会理解他的调用过程
m_pMainWnd->ShowWindow(nCmdShow); //
m_pMainWnd->UpdateWindow(); //
return TRUE;
}
int CWinApp::Run()
{
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//------------------------------------------------------------
Run()函数是一个消息成员函数。系统为程序建立了叫做消息队列的一个存储空间,在程序的运行过程中,如果发生了一个事件,Windows就会把这个事件所对应的消息送入消息队列等待使用。而应用程序为了取得队列中的消息,就会调用Windows提供的一个API函数GetMessage,并利用这个函数的返回值(当获得消息时,返回TRUE,否则,返回FALSE)组织一个循环来不断获取消息队列中的消息,一旦获得消息,就把这个消息送给系统,即DispatchMessage(&msg)函数。而TranslateMessage(&msg)是把
键盘消息 翻译成字符消息。
//---------------------------------
相关文章推荐
- VC++动态链接库编程之基础慨念
- VC++动态链接库编程之基础慨念
- VC++动态链接库编程之基础慨念
- VC++动态链接库编程之基础慨念
- VC++动态链接库编程之基础慨念
- VC++动态链接库编程之基础慨念
- 一些基础:VC编程经验和错误
- 入门基础-VC网络编程入门(2)
- VC++动态链接库编程之基础慨念
- VC++动态链接库编程之基础慨念
- VC++动态链接库编程之基础概念
- VC++动态链接库编程之基础慨念
- VC++动态链接库编程之基础慨念
- VC++动态链接库编程之基础慨念
- java/vc单点登录的简单实现-Java基础-Java-编程开发
- VC++动态链接库编程之基础慨念
- VC++动态链接库编程之基础慨念
- VC++动态链接库编程之基础慨念(上)
- VC编程基础:文件和文件夹操作
- vc++图形编程基础