| | | Visual C++6.0开发灰度位图处理 | | 2001-09-10·
·刘涛 蒋建国··yesky
| 上一页 1 2 3 4 5 下一页 二、 调色板的操作
灰度图像要正确显示,必须实现逻辑调色板和系统调色板 ,通过在主框架类中处理Windows定义的消息WM_QUERYNEWPALETTE 、WM_PALETTECHANGED及视图类中处理自定义消息WM_DOREALIZE(该消息在主框架窗口定义如下:#define WM_REALIZEPAL (WM_USER+100))来实现调色板的操作。
void CMainFrame::OnPaletteChanged(CWnd* pFocusWnd) { file://总实现活动视的调色板 CMDIFrameWnd::OnPaletteChanged(pFocusWnd); CMDIChildWnd* pMDIChildWnd = MDIGetActive(); if (pMDIChildWnd == NULL) return CView* pView = pMDIChildWnd->GetActiveView(); ASSERT(pView != NULL); SendMessageToDescendants(WM_DOREALIZE, (WPARAM)pView->m_hWnd); file://通知所有子窗口系统调色板已改变 } BOOL CMainFrame::OnQueryNewPalette()//提供实现系统调色板的机会 { // 实现活动视的调色板 CMDIChildWnd* pMDIChildWnd = MDIGetActive(); if (pMDIChildWnd == NULL) return FALSE; // no active MDI child frame (no new palette) CView* pView = pMDIChildWnd->GetActiveView(); ASSERT(pView != NULL); file://通知活动视图实现系统调色板 pView->SendMessage(WM_DOREALIZE, (WPARAM)pView->m_hWnd); return TRUE; } LRESULT CDibView::OnDoRealize(WPARAM wParam, LPARAM)//实现系统调色板 { ASSERT(wParam != NULL); CDibDoc* pDoc = GetDocument(); if (pDoc->m_hDIB == NULL) return 0L; // must be a new document CPalette* pPal = pDoc->m_palDIB; file://调色板的颜色表数据在InitDIBData()函数中实现 if (pPal != NULL) { CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd; ASSERT_KINDOF(CMainFrame, pAppFrame); CClientDC appDC(pAppFrame); CPalette* oldPalette = appDC.SelectPalette(pPal, ((HWND)wParam) != m_hWnd); file://只有活动视才可以设为"FALSE", // 即根据活动视的调色板设为"前景"调色板 if (oldPalette != NULL) { UINT nColorsChanged = appDC.RealizePalette();//实现系统调色板 if (nColorsChanged > 0) pDoc->UpdateAllViews(NULL);//更新视图 appDC.SelectPalette(oldPalette, TRUE); file://将原系统调色板置为逻辑调色板 } else { TRACE0("\tSelectPalette failed in CDibView::OnPaletteChanged\n"); } }
| 注:在调用API函数显示位图时,不要忘记设置逻辑调色板,即"背景"调色板,否则位图将无法正确显示。
上一页 1 2 3 4 5 下一页 | | | 感谢
访问天极网,如果您觉得该文章涉及版权问题,请看这里!
|
|