如何使用windows api建立模式对话框
http://msdn2.microsoft.com/en-us/library/ms644996.aspx#modal_box
http://msdn2.microsoft.com/en-us/library/ms644995.aspx#wm_initdialog
磁性窗口
http://blog.youkuaiyun.com/uvbs/archive/2007/07/05/1680349.aspx
在模式对话框中如何在WM_INITDIALOG消息中获得额外的信息
使用DialogBoxParam而不是CreateDialog来建立模式对话框,可以在参数中使用void指针传入额外的信息
如何在WM_CREATE中传入额外信息
CreateWindow中的一个参数可以用一个void指针来传递需要的信息
RICHEDITBOX使用
richedit 常见使用问题
http://blog.youkuaiyun.com/checkyvc6/archive/2006/03/29/642973.aspx
WINDOW STYLE 中的 WS_CLIPCHILDREN 和 WS_CLIPSIBLINGS这两个属性
http://www.bokebb.com/dev/cn/vc/interface/200510195003_4314951.shtml
自己仿照mfc写了一个mywindow的基类,使用了一个map管理hwnd和this指针的关系
mywindow.h
#include
<
map
>

class
MyWindow
...
{
public:
MyWindow(void);

HWND GetHWND() ...{
return hwnd_;
}
protected: // virtual process
virtual LRESULT CALLBACK OnMouseMove(int x,
int y,
WPARAM wparam,
LPARAM lparam);

virtual LRESULT CALLBACK OnKeyDown(int key_code,
WPARAM wparam,
LPARAM lparam);

virtual LRESULT CALLBACK OnPaint(WPARAM wparam, LPARAM lparam);
virtual LRESULT CALLBACK OnCreate(WPARAM wparam, LPARAM lparam);
virtual LRESULT CALLBACK OnParentNotify(WPARAM wparam, LPARAM lparam);
virtual LRESULT CALLBACK OnKillFocus(WPARAM wparam, LPARAM lparam);
virtual LRESULT CALLBACK OnDestory(WPARAM wparam, LPARAM lparam);
void inline CreateWindows(HWND hwnd);
// If need add others here
static LRESULT CALLBACK WndProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam);

void inline DestoryWindow();
protected:
HWND hwnd_;
WNDPROC old_Proc;
protected:
virtual LRESULT CALLBACK CallOldProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam);

static inline MyWindow* FindWindowByHWND(HWND hwnd);
public:
virtual ~MyWindow(void);

protected:
// create hwnd and instance pointer pair
static std::map<HWND, MyWindow*> hwnd_instatnce_map;

}
;


MyWindow
*
MyWindow::FindWindowByHWND(HWND hwnd)
...
{

if (hwnd_instatnce_map.find(hwnd) != hwnd_instatnce_map.end()) ...{
std::map<HWND, MyWindow*>::iterator itor = hwnd_instatnce_map.find(hwnd);
return itor->second;

} else ...{
return NULL;
}
}


void
MyWindow::DestoryWindow()
...
{

if (hwnd_ != NULL) ...{

if (this->old_Proc != NULL) ...{
// set back to the old proc
SetWindowLong(hwnd_,
GWL_WNDPROC,
reinterpret_cast<LONG>(this->old_Proc));

this->old_Proc = NULL;
}

hwnd_instatnce_map.erase(hwnd_);
DestroyWindow(hwnd_);
hwnd_ = NULL;
}
}



void
MyWindow::CreateWindows(HWND hwnd)
...
{
this->hwnd_ = hwnd;
hwnd_instatnce_map[hwnd] = this;
// have to do so
this->old_Proc = reinterpret_cast<WNDPROC>(
SetWindowLong(hwnd,
GWL_WNDPROC,
reinterpret_cast<LONG>(MyWindow::WndProc)));
}
mywindow.cpp
#include
"
MyWindow.h
"
std::map
<
HWND, MyWindow
*>
MyWindow::hwnd_instatnce_map;

MyWindow::MyWindow(
void
)
: hwnd_(NULL),

old_Proc(NULL)
...
{
}


MyWindow::
~
MyWindow(
void
)
...
{

if (hwnd_ != NULL) ...{

if (this->old_Proc != NULL) ...{
// set back to the old proc
SetWindowLong(hwnd_, GWL_WNDPROC, reinterpret_cast<LONG>(this->old_Proc));
this->old_Proc = NULL;
}

if (hwnd_instatnce_map.find(hwnd_) != hwnd_instatnce_map.end()) ...{
hwnd_instatnce_map.erase(hwnd_);

} else ...{
assert(false); // shoule never happen
}
}
}

LRESULT CALLBACK MyWindow::CallOldProc(HWND hwnd_,
UINT msg,
WPARAM wparam,

LPARAM lparam)
...
{

if (this->old_Proc == NULL) ...{
return DefWindowProc(hwnd_, msg, wparam, lparam);

} else ...{
return CallWindowProc(this->old_Proc, hwnd_, msg, wparam, lparam);
}
}

LRESULT CALLBACK MyWindow::WndProc(HWND hwnd,
UINT msg,
WPARAM wparam,

LPARAM lparam)
...
{
MyWindow* p_win = NULL;


if (msg != WM_CREATE) ...{
p_win = FindWindowByHWND(hwnd);

if (p_win == NULL) ...{
return DefWindowProc(hwnd, msg, wparam, lparam);
}

} else ...{ // WM_CREATE Message
CREATESTRUCT* p = reinterpret_cast<CREATESTRUCT*>(lparam);
p_win = reinterpret_cast<MyWindow*>(p->lpCreateParams);
assert(p_win != NULL);

if (p_win == NULL) ...{
return DefWindowProc(hwnd, msg, wparam, lparam);
}
p_win->hwnd_ = hwnd;
hwnd_instatnce_map[hwnd] = p_win;
}


switch (msg) ...{

case WM_CREATE: ...{
return p_win->OnCreate(wparam, lparam);
}

case WM_PAINT: ...{
return p_win->OnPaint(wparam, lparam);
}

case WM_MOUSEMOVE: ...{
WORD xPos = LOWORD(lparam); // relate to control
WORD yPos = HIWORD(lparam); // relate to control
return p_win->OnMouseMove(xPos, yPos, wparam, lparam);
}

case WM_KILLFOCUS: ...{
return p_win->OnKillFocus(wparam, lparam);
}

case WM_KEYDOWN: ...{
int nVirtKey = static_cast<int>(wparam);
return p_win->OnKeyDown(nVirtKey, wparam, lparam);
}

case WM_PARENTNOTIFY: ...{
return p_win->OnParentNotify(wparam, lparam);
}

case WM_DESTROY: ...{
return p_win->OnDestory(wparam, lparam);
}
}
return p_win->CallOldProc(hwnd,
msg,
wparam,
lparam);
}


LRESULT CALLBACK MyWindow::OnMouseMove(
int
x,
int
y,
WPARAM wparam,

LPARAM lparam)
...
{
return this->CallOldProc(
hwnd_,
WM_MOUSEMOVE,
wparam,
lparam);
}
LRESULT CALLBACK MyWindow::OnKeyDown(
int
key_code,
WPARAM wparam,

LPARAM lparam)
...
{
return this->CallOldProc(hwnd_,
WM_KEYDOWN,
wparam,
lparam);
}
LRESULT CALLBACK MyWindow::OnPaint(WPARAM wparam,

LPARAM lparam)
...
{
return this->CallOldProc(hwnd_,
WM_PAINT,
wparam,
lparam);
}


LRESULT CALLBACK MyWindow::OnCreate(WPARAM wparam, LPARAM lparam)
...
{
return this->CallOldProc(hwnd_,
WM_PARENTNOTIFY,
wparam,
lparam);
}

LRESULT CALLBACK MyWindow::OnParentNotify(WPARAM wparam,

LPARAM lparam)
...
{
return this->CallOldProc(hwnd_,
WM_CREATE,
wparam,
lparam);
}

LRESULT CALLBACK MyWindow::OnKillFocus(WPARAM wparam,

LPARAM lparam)
...
{
return this->CallOldProc(hwnd_,
WM_KILLFOCUS,
wparam,
lparam);
}
LRESULT CALLBACK MyWindow::OnDestory(WPARAM wparam,

LPARAM lparam)
...
{
return this->CallOldProc(hwnd_,
WM_DESTROY,
wparam,
lparam);
}