扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:刘涛 来源:作者授权转载 2007年10月21日
关键字:
typedef struct tagLOGPALETTE { WORD palVersion;//调色板的板本号,应该指定该值为0x300; WORD palNumEntries;//调色板中的表项数,对于灰度图像该值为256; PALETEENTRY palPalEntry[1];//调色板中的颜色表项,由于该表项的数目不一定,所以这里数组长度定义为1,灰度图像对应的该数组的长度为256; }LOGPALETTE; 颜色表项结构PALETTEENTRY定义了调色板中的每一个颜色表项的颜色和使用方式,定义如下: typedef struct tagPALETTEENTRY { BYTE peRed; //R分量值; BYTE peGreen; //G分量值; BYTE peBlue; //B分量值; BYTE peFlags; // 该颜色被使用的方式,一般情况下设为“0”; }PALETTEENTRY; |
////////////////////////////////////////////////////////// void CMainFrame::OnPaletteChanged(CWnd* pFocusWnd) {//总实现活动视的调色板 CMDIFrameWnd::OnPaletteChanged(pFocusWnd); CMDIChildWnd* pMDIChildWnd = MDIGetActive();//得到活动的子窗口指针; if (pMDIChildWnd == NULL) return CView* pView = pMDIChildWnd->GetActiveView();//得到视图的指针; ASSERT(pView != NULL); SendMessageToDescendants(WM_DOREALIZE, (WPARAM)pView->m_hWnd); //通知所有子窗口系统调色板已改变 } //////////////////////////////////////////////// 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); //通知活动视图实现系统调色板 pView->SendMessage(WM_DOREALIZE, (WPARAM)pView->m_hWnd); return TRUE; } ///////////////////////////////////////////////// BOOL CDibView::OnDoRealize(WPARAM wParam, LPARAM)//实现系统调色板 { ASSERT(wParam != NULL); CDibDoc* pDoc = GetDocument(); if (pDoc->m_hDIB == NULL) return FALSE; // must be a new document CPalette* pPal = pDoc->m_palDIB; //调色板的颜色表数据在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); //只有活动视才可以设为"FALSE",即根据活动视的调色板设为"前景"调色板; if (oldPalette != NULL) { UINT nColorsChanged = appDC.RealizePalette();//实现系统调色板 if (nColorsChanged > 0) pDoc->UpdateAllViews(NULL);//更新视图 appDC.SelectPalette(oldPalette, TRUE); //将原系统调色板置为背景调色板 } else { TRACE0(“\tSelectPalette failed in”); } return TRUE; } |
///////////////////////////////////////////////////////// CDibDoc::CDibDoc() { ………………………. LOGPALETTE *Pal; Pal=new LOGPALETTE; m_palDIB=new Cpalette; pPal->palVersion=0x300; pPal->palNumEntries=256; for(int i=0;i<256;i++) {//每个颜色表项的R、G、B值相等,并且各个值从“0”到“255”序列展开; Pal->palPalentry[i].peRed=i; pPal->palPalentry[i].peGreen=i; pPal->palPalentry[i].peBlue=i; pPal->palPalentry[i].peFlags=0; } m_palDIB->CreatePalette(pPal); ………………….. } |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者