精通Visual C++圖象程式設計---讀書筆記6.2

藍色水發表於2020-04-05
  由於活動的視窗或應用程式將用自己的調色盤更新系統調色盤,當系統察覺到調色盤發生變化時,將向程式的主框視窗傳送WM_PALETTECHANGED和WM_QUERYNEWPALETTE訊息.所以只能在主框視窗中響應這兩個訊息,然後由主框窗通知各視窗,使得程式啟用時能自動裝載自己的調色盤.
    當前調色盤由顯示DIB的各視窗儲存,所以在接收到WM_PALETTECHANGED和WM_QUERYNEWPALETTE訊息時,應通知視窗.
    我們定義了一個使用者訊息WM_REALIZEPAL,用於主框通知視窗,它已收到通知視窗WM_PALETTECHANGED和WM_QUERYNEWPALETTE訊息,視窗應協調其調色盤.該訊息在MainFrm.h中定義如下:
    #define WM_REALIZEPAL (WM_USER+0x100)
   響應WM_PALETTECHANGED和WM_QUERYNEWPALETTE的函式程式碼如下:
  void CMainFrame::OnPaletteChanged(CWnd* pFocusWnd)
  {
     CMDIFrameWnd::OnPaletteChanged(pFocusWnd);
     //總實現在活動視的調色盤
     CMDIChildWnd* pMDIChildWnd=MDIGetActive();
        if(pMDIChildwnd==NULL)
             return;   //沒有活動的視
      CView* pView=pMdiChildWnd->GetActiveView();
      ASSERT(pView!=NULL);
     //通知所有的子窗,系統調色盤已修改
      SendMessageToDescendants(WM_REALIZEPAL,(WPARAM)pView->m_hWnd);
     }
    BOOL CMainFrame::OnQueryNewPalette()
{
//總實現在活動視的調色盤
   CMDIChildWnd* pMDIChildWnd=MDIGetActive();
   if(pMDIChildWnd==NULL)
          return  FALSE;//沒有活動的子窗
   CView* pView=pMDIChildWnd->GetActiveView();
   ASSERT(pView!=NULL);
    //通知相應的視,系統調色盤已修改
   pView->SendMessage(WM_REALIZEPAL,(WPARAM)pView->m_hWnd);
   return TRUE;
}....
後面的看精通Visual C++圖象程式設計158頁,呵呵,這讓我懂得了qq換皮膚原來 可以那麼簡單.
 

相關文章