如何使用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.csdn.net/uvbs/archive/2007/07/05/1680349.aspx
在模式对话框中如何在WM_INITDIALOG消息中获得额外的信息
使用DialogBoxParam而不是CreateDialog来建立模式对话框,可以在参数中使用void指针传入额外的信息
如何在WM_CREATE中传入额外信息
CreateWindow中的一个参数可以用一个void指针来传递需要的信息
RICHEDITBOX使用
richedit 常见使用问题
http://blog.csdn.net/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)));
}
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)));
}
#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);
}
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);
}