<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      WIN32 窗口封裝類實現

      CQWnd.h窗口類定義

      // QWnd.h: interface for the CQWnd class.
      //
      //////////////////////////////////////////////////////////////////////
      
      #if !defined(AFX_QWND_H__9158FC5D_DF60_450D_8BE4_270C74A4F256__INCLUDED_)
      #define AFX_QWND_H__9158FC5D_DF60_450D_8BE4_270C74A4F256__INCLUDED_
      
      #if _MSC_VER > 1000
      #pragma once
      #endif // _MSC_VER > 1000
      #include <windows.h>
      #include <assert.h>
      
      //定義消息映射宏
      #define QWND_DECLARE_MESSAGE_MAP(cls) public:virtual BOOL DispatchWindowProc(UINT uMsg,WPARAM wParam,LPARAM lParam);
      #define QWND_BEGIN_MESSAGE_MAP(cls,base_cls) BOOL cls::DispatchWindowProc(UINT uMsg,WPARAM wParam,LPARAM lParam){
      #define QWND_MESSAGE_MAP(id,fun) if(uMsg==id){return fun(uMsg,wParam,lParam);}
      #define QWND_MESSAGE_CHAIN_MAP(id,cls) if(uMsg==id){return cls::DispatchWindowProc(id,wParam,lParam);}
      #define QWND_END_MESSAGE_MAP() return CQWnd::DispatchWindowProc(uMsg,wParam,lParam);}
      #define QWND_END_MESSAGE_DEFAULT_MAP() return DefaultWindowProc(uMsg,wParam,lParam);}
      #define QWND_END_MESSAGE_SYS_MAP() return ::DefWindowProc(m_hWnd,uMsg,wParam,lParam);}
      #define QWND_COMMAND_CODE_MAP(code,fun) if(uMsg == WM_COMMAND && code == HIWORD(wParam)){return fun(hWnd,uMsg,wParam,lParam);}  
      #define QWND_COMMAND_ID_MAP(id,fun) if(uMsg == WM_COMMAND && id == LOWORD(wParam)){return fun(hWnd,uMsg,wParam,lParam);}  
      #define QWND_COMMAND_MAP(id,code,fun) if(uMsg == WM_COMMAND && id == LOWORD(wParam) && code == HIWORD(wParam)){return fun(hWnd,uMsg,wParam,lParam);}  
      //框架支持全局函數
      WNDPROC GetSuperWndProcAddr();
      //純虛函數接口完成消息映射
      class IMessageMap{
      public:
          virtual BOOL DispatchWindowProc(UINT uMsg,WPARAM wParam,LPARAM lParam)=0;
      };
      
      class ICommandMap{
      public:
          virtual HRESULT DisCommand(UINT uMsg,WPARAM wParam,LPARAM lParam)=0;
      };
      
      //窗口基類
      class CQWnd:public IMessageMap{
      QWND_DECLARE_MESSAGE_MAP(CQWnd)
      public:
          CQWnd();
          virtual ~CQWnd();
      public:
          BOOL Attach(HWND hWnd);
          BOOL CreateEx(DWORD dwExStyle,LPCTSTR lpszClassName,LPCTSTR lpszWindowName,DWORD dwStyle,int x,int y,int cx,int cy,CQWnd* hParent,HMENU mMenu,HINSTANCE hInstance);
          BOOL CenterWindow(BOOL bRepaint=TRUE);
          BOOL Detach(void);
          BOOL DestoryWindow();
          BOOL EnableWindow(BOOL bEnable);
          BOOL GetWindowRect(LPRECT lpRect);
          BOOL GetClientRect(LPRECT lpRect);
          BOOL IsWindowVisible();
          //獲取句柄相關窗口對象
          CQWnd* GetWndFromHandle(HWND hWnd);
          BOOL MoveWindow(int X, int Y, int nWidth, int nHeight, BOOL bRepaint);
          BOOL ShowWindow(int nCmdShow);
          BOOL SetWindowText(LPCSTR lpString);
          BOOL SetMenu(HMENU hMenu);
          BOOL SubClassWindow(HWND hWnd);
          BOOL UpdateWindow(void);
          //虛函數定義預知消息
          virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
          virtual HRESULT OnCreate(UINT uMsg,WPARAM wParam, LPARAM lParam);
          virtual HRESULT OnClose(UINT uMsg,WPARAM wParam, LPARAM lParam);
          virtual HRESULT OnDestroy(UINT uMsg,WPARAM wParam, LPARAM lParam);
          virtual HRESULT OnNcDestroy(UINT uMsg,WPARAM wParam, LPARAM lParam);
          virtual HRESULT OnNcCreate(UINT uMsg,WPARAM wParam, LPARAM lParam);
          virtual HRESULT OnCommand(UINT uMsg,WPARAM wParam, LPARAM lParam);
          virtual BOOL DefaultWindowProc(UINT uMsg,WPARAM wParam,LPARAM lParam);
      public:
          //靜態函數處理窗口函數過程
          static LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
      public:
          //封裝窗口句柄
          HWND m_hWnd;
          //原窗口處理函數
          WNDPROC m_lpfnOldWndProc;
      protected:
          CQWnd* m_hParent;
      private:
          BOOL m_bReg;
          BOOL m_bEnableNcCreate;
      };
      
      #endif // !defined(AFX_QWND_H__9158FC5D_DF60_450D_8BE4_270C74A4F256__INCLUDED_)

      CQWnd.cpp窗口類實現

      // QWnd.cpp: implementation of the CQWnd class.
      //
      //////////////////////////////////////////////////////////////////////
      
      #include "stdafx.h"
      #include "QWnd.h"
      
      //////////////////////////////////////////////////////////////////////
      // Construction/Destruction
      //////////////////////////////////////////////////////////////////////
      
      QWND_BEGIN_MESSAGE_MAP(CQWnd,NULL)
          QWND_MESSAGE_MAP(WM_CREATE,CQWnd::OnCreate)
          QWND_MESSAGE_MAP(WM_CLOSE,CQWnd::OnClose)
          QWND_MESSAGE_MAP(WM_DESTROY,CQWnd::OnDestroy)
          QWND_MESSAGE_MAP(WM_NCDESTROY,CQWnd::OnNcDestroy)
          QWND_MESSAGE_MAP(WM_NCCREATE,CQWnd::OnNcCreate)
          QWND_MESSAGE_MAP(WM_COMMAND,CQWnd::OnCommand)
      QWND_END_MESSAGE_DEFAULT_MAP()
      
      CQWnd::CQWnd(){
          m_hWnd=NULL;
          m_lpfnOldWndProc=NULL;
          m_bReg=FALSE;
          m_hParent=NULL;
          m_bEnableNcCreate=FALSE;
      }
      
      CQWnd::~CQWnd(){
      }
      
      BOOL CQWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,LPCTSTR lpszWindowName,DWORD dwStyle,int x,int y,int cx,int cy,CQWnd* hParent,HMENU hMenu,HINSTANCE hInstance){
          CREATESTRUCT cs;
          m_hParent=hParent;
          //窗口額外空間(包含當前對象this指針)
          cs.lpCreateParams=(LPVOID)this;
          cs.hInstance=hInstance;
          cs.hMenu=hMenu;
          cs.hwndParent=m_hParent?m_hParent->m_hWnd:NULL;
          cs.cx=cx;
          cs.cy=cy;
          cs.x=x;
          cs.y=y;
          cs.style=dwStyle;
          cs.lpszName=lpszWindowName;
          cs.lpszClass=lpszClassName;
          cs.dwExStyle=dwExStyle;
          BOOL ret=PreCreateWindow(cs);
          assert(ret);
          m_hWnd=CreateWindowEx(cs.dwExStyle,cs.lpszClass,cs.lpszName,cs.style,cs.x,cs.y,cs.cx,cs.cy,cs.hwndParent,cs.hMenu,cs.hInstance,cs.lpCreateParams);
          if(NULL==m_hWnd)
              return FALSE;
          m_lpfnOldWndProc=(WNDPROC)::GetWindowLong(m_hWnd,GWL_WNDPROC);
          if(m_bReg){
              //已注冊窗口完成窗口數據更新
              if(m_lpfnOldWndProc!=CQWnd::WindowProc){
                  ::SetWindowLong(m_hWnd,GWL_WNDPROC,(LONG)CQWnd::WindowProc);
                  ::SetWindowLong(m_hWnd,GWL_USERDATA,(LONG)this);
                  //發送消息WM_NCCREATE,WM_CREATE,因為已注冊窗口第一次發送至默認處理過程無法截取
                  if(m_bEnableNcCreate)
                      ::SendMessage(m_hWnd,WM_NCCREATE,0,(LONG)&cs);
                  ::SendMessage(m_hWnd,WM_CREATE,0,(LONG)&cs);
              }
          }
          return TRUE;
      }
      
      BOOL CQWnd::PreCreateWindow(CREATESTRUCT& cs){
          //判斷窗口是否已經注冊
          WNDCLASSEX wcex;
          ZeroMemory(&wcex,sizeof(WNDCLASSEX));
          wcex.cbSize=sizeof(WNDCLASSEX);
          if(GetClassInfoEx(cs.hInstance,cs.lpszClass,&wcex)){
              m_bReg=TRUE;
              return TRUE;
          }
              
          //已注冊則直接返回,未注冊則注冊新的窗口(結構體每項都需要賦值)
          wcex.cbSize=sizeof(WNDCLASSEX);
          wcex.style=CS_HREDRAW|CS_VREDRAW;
          wcex.lpfnWndProc=CQWnd::WindowProc;
          wcex.cbClsExtra=0;
          wcex.cbWndExtra=0;
          wcex.hIcon=::LoadIcon(NULL,IDI_APPLICATION);
          wcex.hIconSm=::LoadIcon(NULL,IDI_WINLOGO);
          wcex.hCursor=::LoadCursor(NULL,IDC_ARROW);
          wcex.hbrBackground=(HBRUSH)::GetStockObject(WHITE_BRUSH);
          wcex.lpszMenuName=NULL;
          wcex.hInstance=cs.hInstance;
          wcex.lpszClassName=cs.lpszClass;
          return ::RegisterClassEx(&wcex);
      }
      
      
      LRESULT CALLBACK CQWnd::WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
          if(WM_NCCREATE==uMsg){
              //取出結構,第一次發送WM_NCCREATE消息設置SetWindowLong
              CREATESTRUCT* pCs=(CREATESTRUCT*)lParam;
              if(pCs){
                  CQWnd* pWnd=(CQWnd*)pCs->lpCreateParams;
                  if(pWnd){
                      //首次為句柄賦值
                      pWnd->m_hWnd=hWnd;
                      //此處必須賦值
                      pWnd->m_lpfnOldWndProc=(WNDPROC)::GetWindowLong(hWnd,GWL_WNDPROC);
                      SetWindowLong(hWnd,GWL_USERDATA,(LONG)pWnd);
                      return pWnd->DispatchWindowProc(uMsg,wParam,lParam);
                  }
              }
          }else{
              //取出上次SetWindowLong對象
              CQWnd* pWnd=(CQWnd*)GetWindowLong(hWnd,GWL_USERDATA);
              if(pWnd){
                  return pWnd->DispatchWindowProc(uMsg,wParam,lParam);
              }
          }
          return ::DefWindowProc(hWnd,uMsg,wParam,lParam);
      }
      
      //默認消息處理函數
      BOOL CQWnd::DefaultWindowProc(UINT uMsg,WPARAM wParam,LPARAM lParam){
          if(m_lpfnOldWndProc!=CQWnd::WindowProc)
              return ::CallWindowProc(m_lpfnOldWndProc,m_hWnd,uMsg,wParam,lParam);
          return ::DefWindowProc(m_hWnd,uMsg,wParam,lParam);
      }
      
      HRESULT CQWnd::OnCommand(UINT uMsg,WPARAM wParam,LPARAM lParam){
          //向子類派發此類消息
          HWND tmpHWnd=GetDlgItem(m_hWnd,LOWORD(wParam));
          if(tmpHWnd!=NULL)
              return ::SendMessage(tmpHWnd,uMsg,wParam,lParam);
          return DefaultWindowProc(uMsg,wParam,lParam); } BOOL CQWnd::CenterWindow(BOOL bRepaint){ assert(IsWindow(m_hWnd)); RECT rect;
      int screenW = GetSystemMetrics(SM_CXSCREEN); int screenH = GetSystemMetrics(SM_CYSCREEN); //獲取窗口矩形 GetWindowRect(&rect); return MoveWindow((screenW-rect.right)/2, (screenH-rect.bottom)/2,rect.right,rect.bottom,bRepaint); } BOOL CQWnd::GetWindowRect(LPRECT lpRect){ assert(IsWindow(m_hWnd)); return ::GetWindowRect(m_hWnd,lpRect); } BOOL CQWnd::GetClientRect(LPRECT lpRect){ assert(IsWindow(m_hWnd)); return ::GetClientRect(m_hWnd,lpRect); } BOOL CQWnd::UpdateWindow(void){ assert(IsWindow(m_hWnd)); return ::UpdateWindow(m_hWnd); } BOOL CQWnd::ShowWindow(int nCmdShow){ assert(IsWindow(m_hWnd)); return ::ShowWindow(m_hWnd,nCmdShow); } BOOL CQWnd::DestoryWindow(){ assert(IsWindow(m_hWnd)); return ::DestroyWindow(m_hWnd); } BOOL CQWnd::Attach(HWND hWnd){ if(hWnd!=NULL){ m_hWnd=hWnd; return TRUE; } return FALSE; } BOOL CQWnd::Detach(void){ m_hWnd=NULL; return TRUE; } CQWnd* CQWnd::GetWndFromHandle(HWND hWnd){ assert(IsWindow(m_hWnd)); return (CQWnd*)GetWindowLong(hWnd,GWL_USERDATA); } BOOL CQWnd::SetWindowText(LPCSTR lpString){ return ::SetWindowText(m_hWnd,lpString); } BOOL CQWnd::SetMenu(HMENU hMenu){ return ::SetMenu(m_hWnd,hMenu); } BOOL CQWnd::SubClassWindow(HWND hWnd){ assert(::IsWindow(hWnd)); if(hWnd==m_hWnd) return TRUE; m_lpfnOldWndProc=(WNDPROC)::GetWindowLong(hWnd,GWL_WNDPROC); if(CQWnd::WindowProc!=m_lpfnOldWndProc){ m_hWnd=hWnd; ::SetWindowLong(hWnd,GWL_USERDATA,(LONG)this); ::SetWindowLong(hWnd,GWL_WNDPROC,(LONG)CQWnd::WindowProc); return TRUE; } return FALSE; } BOOL CQWnd::MoveWindow(int X, int Y, int nWidth, int nHeight, BOOL bRepaint){ return ::MoveWindow(m_hWnd,X,Y,nWidth,nHeight,bRepaint); } BOOL CQWnd::EnableWindow(BOOL bEnable){ return ::EnableWindow(m_hWnd,bEnable); } BOOL CQWnd::IsWindowVisible(){ return ::IsWindowVisible(m_hWnd); } HRESULT CQWnd::OnCreate(UINT uMsg,WPARAM wParam, LPARAM lParam){ return DefaultWindowProc(uMsg,wParam,lParam); } HRESULT CQWnd::OnClose(UINT uMsg,WPARAM wParam, LPARAM lParam){ DestoryWindow(); return 0; } HRESULT CQWnd::OnDestroy(UINT uMsg,WPARAM wParam, LPARAM lParam){ ::PostMessage(m_hWnd,WM_QUIT,0,0); return DefaultWindowProc(uMsg,wParam,lParam); } HRESULT CQWnd::OnNcDestroy(UINT uMsg,WPARAM wParam, LPARAM lParam){ return DefaultWindowProc(uMsg,wParam,lParam); } HRESULT CQWnd::OnNcCreate(UINT uMsg,WPARAM wParam, LPARAM lParam){ return DefaultWindowProc(uMsg,wParam,lParam); } WNDPROC GetSuperWndProcAddr(){ return CQWnd::WindowProc; }

      消息派發及其框架類

      // QWApp.h: interface for the CQWApp class.
      //
      //////////////////////////////////////////////////////////////////////
      
      #if !defined(AFX_QWAPP_H__74A97BCE_7976_4266_A0AD_113C0E65DC90__INCLUDED_)
      #define AFX_QWAPP_H__74A97BCE_7976_4266_A0AD_113C0E65DC90__INCLUDED_
      
      #if _MSC_VER > 1000
      #pragma once
      #endif // _MSC_VER > 1000
      
      class CQWApp  
      {
      public:
          LPVOID m_pMainWnd;
          virtual BOOL Run();
          virtual BOOL ExitInstance();
          virtual BOOL InitInstance();
          CQWApp();
          virtual ~CQWApp();
      };
      
      #endif // !defined(AFX_QWAPP_H__74A97BCE_7976_4266_A0AD_113C0E65DC90__INCLUDED_)
      
      // QWApp.cpp: implementation of the CQWApp class.
      //
      //////////////////////////////////////////////////////////////////////
      
      #include "stdafx.h"
      #include "QWApp.h"
      
      //////////////////////////////////////////////////////////////////////
      // Construction/Destruction
      //////////////////////////////////////////////////////////////////////
      
      CQWApp::CQWApp()
      {
      
      }
      
      CQWApp::~CQWApp()
      {
      
      }
      
      BOOL CQWApp::InitInstance()
      {
          return TRUE;
      }
      
      BOOL CQWApp::ExitInstance()
      {
          return TRUE;
      }
      
      BOOL CQWApp::Run(){
          MSG msg;
          while(GetMessage(&msg,NULL,0,0)){ 
              //從消息隊列中取得消息
              TranslateMessage(&msg);
              //檢索并生成字符消息WM_CHAR
              DispatchMessage(&msg);
              //將消息發送給相應的窗口函數
          }
          return TRUE;
      }

       

       

      源碼下載:https://files.cnblogs.com/mengdejun/qwnd.zip

       案例下載:https://files.cnblogs.com/mengdejun/qw.zip

      posted @ 2014-10-08 00:07  小孟文摘  閱讀(1954)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产肥臀视频一区二区三区| 色狠狠色噜噜AV一区| 亚洲欧洲∨国产一区二区三区| 亚洲精品久久久久久无码色欲四季 | 久久精品免费观看国产| 日韩精品人妻中文字幕| 国产精品毛片av999999| 欧美极品色午夜在线视频| 粉嫩av蜜臀一区二区三区| 久久高清超碰AV热热久久| 久久香蕉国产线看观看怡红院妓院| 超碰成人精品一区二区三| 香蕉亚洲欧洲在线一区| 国产av一区二区三区久久| 中文字幕亚洲人妻系列| 海宁市| 久久久久久久久久久免费精品| 五月天天天综合精品无码| 激情综合网一区二区三区| 国产裸体美女视频全黄| 和黑人中出一区二区三区| 亚洲欧洲日韩国内精品| 国产成人精品无码播放| 九九热爱视频精品视频| 免费又爽又大又高潮视频| 国产最大成人亚洲精品| 18禁一区二区每日更新| 国产成人精品aa毛片| 亚洲精品一区国产欧美| 日本怡春院一区二区三区| 日本三级香港三级三级人妇久| 人成午夜免费大片| 在线高清免费不卡全码| 午夜精品区| 香蕉乱码成人久久天堂爱| 亚洲va久久久噜噜噜久久狠狠| 人妻系列无码专区免费| 国产精品制服丝袜第一页| 中文字幕有码高清日韩| 国产仑乱无码内谢| 亚洲国产精品综合久久20|