www.gusucode.com > 自绘对话框C++源码程序 > 自绘对话框/OwnerDrawDlg/OwnerDrawDlg/testDlg.cpp
// testDlg.cpp : implementation file // #include "stdafx.h" #include "test.h" #include "testDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTestDlg dialog CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/) : CDialog(CTestDlg::IDD, pParent) { //{{AFX_DATA_INIT(CTestDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CTestDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTestDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CTestDlg, CDialog) //{{AFX_MSG_MAP(CTestDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_LBUTTONDOWN() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTestDlg message handlers BOOL CTestDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control } void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CTestDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { this->DrawView(); //此句为自添加 CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CTestDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } //创建图 HBITMAP CTestDlg::CreateGradientBMP(HDC hDC, COLORREF cl1, COLORREF cl2, int nWidth, int nHeight, int nDir, int nNumColors) { if(nNumColors > 256) nNumColors = 256; COLORREF PalVal[256]; memset(PalVal, 0, sizeof(COLORREF)*256); int nIndex; BYTE peRed=0,peGreen=0,peBlue=0; int r1=GetRValue(cl1); int r2=GetRValue(cl2); int g1=GetGValue(cl1); int g2=GetGValue(cl2); int b1=GetBValue(cl1); int b2=GetBValue(cl2); for (nIndex = 0; nIndex < nNumColors; nIndex++) { peRed = (BYTE) (r1 + MulDiv((r2-r1),nIndex,nNumColors-1)); peGreen = (BYTE) (g1 + MulDiv((g2-g1),nIndex,nNumColors-1)); peBlue = (BYTE) (b1 + MulDiv((b2-b1),nIndex,nNumColors-1)); PalVal[nIndex]=(peRed << 16) | (peGreen << 8) | (peBlue); } int x,y,w,h; w=nWidth; h=nHeight; LPDWORD pGradBits; BITMAPINFO GradBitInfo; pGradBits=(DWORD*) malloc(w*h*sizeof(DWORD)); memset(&GradBitInfo,0,sizeof(BITMAPINFO)); GradBitInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); GradBitInfo.bmiHeader.biWidth=w; GradBitInfo.bmiHeader.biHeight=h; GradBitInfo.bmiHeader.biPlanes=1; GradBitInfo.bmiHeader.biBitCount=32; GradBitInfo.bmiHeader.biCompression=BI_RGB; if(nDir==0) { for(y=0;y<h;y++) { for(x=0;x<w;x++) { *(pGradBits+(y*w)+x)=PalVal[MulDiv(nNumColors,y,h)]; } } } else if(nDir==1) { for(y=0;y<h;y++) { int l,r; l=MulDiv((nNumColors/2),y,h); r=l+(nNumColors/2)-1; for(x=0;x<w;x++) { *(pGradBits+(y*w)+x)=PalVal[l+MulDiv((r-l),x,w)]; } } } else if(nDir==2) { for(x=0;x<w;x++) { for(y=0;y<h;y++) { *(pGradBits+(y*w)+x)=PalVal[MulDiv(nNumColors,x,w)]; } } } else if(nDir==3) { for(y=0;y<h;y++) { int l,r; r=MulDiv((nNumColors/2),y,h); l=r+(nNumColors/2)-1; for(x=0;x<w;x++) { *(pGradBits+(y*w)+x)=PalVal[l+MulDiv((r-l),x,w)]; } } } HBITMAP hBmp = CreateDIBitmap(hDC,&GradBitInfo.bmiHeader,CBM_INIT, pGradBits,&GradBitInfo,DIB_RGB_COLORS); free(pGradBits); return hBmp; } void CTestDlg::DrawView() { CPaintDC dc(this); CRect rect; CString strText="TEST. HEllo WoRLD! 你好,VCKBASE!"; //文本内容 GetClientRect(rect); rect.right=27; //自绘区域宽度 COLORREF m_clrSideBarStart; //自绘区域起始处颜色 COLORREF m_clrSideBarEnd; //自绘区域结束处颜色 m_clrSideBarStart=RGB(205,205,205); //灰色 m_clrSideBarEnd=RGB(100,0,0); //褐色 //创建图及绘制区域 HBITMAP bmpBar = CreateGradientBMP( dc.m_hDC, m_clrSideBarStart, m_clrSideBarEnd, rect.Width(), rect.Height(), 0, 256); if (bmpBar) { CDC memDC; memDC.CreateCompatibleDC(&dc); HBITMAP hOldBmp = (HBITMAP)::SelectObject(memDC.m_hDC, bmpBar); dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY); ::SelectObject(memDC, hOldBmp); ::DeleteObject(bmpBar); } //绘制文本 CFont vertFont; //字体 vertFont.CreateFont(16, 0, 900, 900, FW_BOLD, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Arial"); CFont *pOldFont = dc.SelectObject(&vertFont); COLORREF oldColor = dc.GetTextColor(); dc.SetTextColor(RGB(255, 255, 255)); //文本颜色 dc.SetBkMode(TRANSPARENT); dc.TextOut(rect.left+2, rect.bottom-4, strText); //文本起始位置 dc.SetTextColor(oldColor); dc.SelectObject(pOldFont); vertFont.DeleteObject(); } void CTestDlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default SendMessage(WM_SYSCOMMAND,0xF012,0); CDialog::OnLButtonDown(nFlags, point); }