一些名词
Windows支持动态链接。 Windows程序调用的函数可分为C Runtimes以及Windows API两大部分。
LIBC.LIB 这是C Runtime函数库的静态链接版本。
MSVCRT.LIB 这是C Runtime函数库到动态链接版本。(程序执行时必须有MSVCRT40.DLL在场)
Windows程序设计最重要的观念:模块将各类消息分类到所属的队列中去,然后以这些消息为基础的事件驱动系统。
CreateWindow()只产生窗口,并不显示窗口。利用ShowWindow()将它显示在屏幕上。
int CALLBACK winMain(HINSTANCE hInstance, hInstance hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
UNREFERENCED_PARAMETER(lpCmdLine);
if(!hPrevInstance)
if(!InitApplication(hInstance)) //窗口注册
return (FALSE);
if(!InitInstance(hInstance, nCmdShow)) //产生窗口
return (FALSE);
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_COMMAND;
...
break;
case WM_DESTORY:
...
default:
return (DefwindowProc(hWnd, message, wParam, lParam));
}
return (0);
}
定义成CALLBACK回调函数,是为了当某个消息或时间发生,开放接口给操作系统调用。
struct MSGMAP_ENTRY
{
UINT nMessage;
LONG (*pfn)(HWND, UINT, WPARAM, LPARAM);
};
#define dim(x) (sizeof(x) / sizeof(x[0]));
//消息与处理例程的对照表格
struct MSGMAP_ENTRY _messageEntries[] =
{
WM_CREATE , OnCreate ,
WM_PAINT , OnPaint ,
WM_COMMAND , OnCommand,
.....
WM_DESTORY , OnDestory,
};
//Command-ID 与处理例程之对照表格
struct MSGMAP_ENTRY _commandEntries[] =
{
IDM_ABOUT , OnAbout ,
IDM_FILEOPEN , OnFileOpen,
IDM_SAVEAS , OnSaveAs ,
};
//窗口函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int i;
for(i = 0; i < dim(_messageEntries); i++)
{
if(message == _messageEntries[i].nMessage)
return ((*_messageEntries[i].pfn)(hWnd, message, wParam, lParam));
}
return (DefwindowProc(hWnd, message, wParam, lParam));
}
//专门处理WM_COMMAND
LONG Command(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int i;
for(i = 0; i < dim(_commandEntries); i++)
{
if(LOWORD(wParam) == _commandEntries[i].nMessage)
return ((*_commandEntries[i].pfn)(hWnd, message, wParam, lParam));
}
return (DefwindowProc(hWnd, message, wParam, lParam));
}
Windows程序的生命周期
传统的SDK程序如果要处理空闲时间,用一下循环代替WinMain中的传统消息循环
while (TRUE)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if(msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DIspatchMessage(&msg);
}
else
{
OnIdle();
}
}
对象的两大属性:属性property,方法method。
抽取共有性质,成立基类。再从中衍生出派生类。派生类继承基类的成员。
this指针
成员函数是有一个隐藏参数,名为this指正。
class CShape
{
private:
int m_color;
public:
void setcolor(int color) { m_color = color };
}
//编译后
class CShape
{
private:
int m_color;
public:
void setcolor(int color, (CShape*)this ) { this->m_color = color };
}
如果预期派生类有可能重新定义某一个成员函数,那么你就在基类中把此函数设为virtual。
当类成员中一个成员变量的值是固定,那么可以在变量前加上static,定义为static成员变量。不要把static成员变量的初始化操作安排的类的构造函数中,因为变量的初值只应该被设定一次。static成员函数同理。
class SavingAcoount
{
private:
char m_name[40];
char m_addr[60];
double m_total;
static doble m_rate;
...
public:
static void setRate(double newRate) { m_rate = newRtae; }
};
doble SavingAcoount::m_rate = 0.0075;
SavingAcoount::setRate(0.0074);