总结:关于界面开发

如何使用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)));
}
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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值