none
CProgressCtrl 多字节环境下可以成功。但unicode下无效。。。 RRS feed

  • 问题

  • CProgressCtrl 多字节环境下可以成功。但unicode下无效。。。

    多字节环境下,前景和背景都能绘制:

    但 UNICODE环境下。只能绘制了 背景。。前景没有显示出来。。是怎么回事??

    我的代码如下:

    // ProgressWnd.cpp : implementation file
    //
    #include "stdafx.h"
    #include "Demo.h"
    #include "ProgressWnd.h"
    #include "resource.h"
    // CProgressWnd
    IMPLEMENT_DYNAMIC(CProgressWnd, CProgressCtrl)
    CProgressWnd::CProgressWnd()
    {
    }
    CProgressWnd::~CProgressWnd()
    {
    }
    BEGIN_MESSAGE_MAP(CProgressWnd, CProgressCtrl)
    	ON_WM_PAINT()
    END_MESSAGE_MAP()
    // CProgressWnd message handlers
    void CProgressWnd::PreSubclassWindow() 
    {
    	// TODO: Add your specialized code here and/or call the base class
    	// 设置自绘
    	ModifyStyle(0, BS_OWNERDRAW) ;
    	// 去掉边界
    	ModifyStyleEx(WS_EX_STATICEDGE, 0);
    	CProgressCtrl::PreSubclassWindow();
    }
    void CProgressWnd::OnPaint()
    {
    	CPaintDC dc(this); // device context for painting
    	CRect rect,rctQJ;
    	GetClientRect(rect);
    	CRect strRect=rect;//文字区域
    	int nPos=GetPos();
    	int nMin,nMax;
    	CDC memDC;
    	memDC.CreateCompatibleDC(&dc);
    	CBitmap bmp;
    	bmp.LoadBitmap(IDB_BITMAP6);
    	BITMAP bmpInfo;
    	bmp.GetBitmap(&bmpInfo);
    	memDC.SelectObject(&bmp);
    	dc.StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,0,0,
    		rect.Width(),rect.Height(),SRCCOPY);//画背景
    // 	rctQJ.left= rect.left -4 ;
    // 	rctQJ.top+2 =rect.top;
    // 	rctQJ.bottom =rect.bottom;
    	GetRange(nMin,nMax);
    	double ratio=(double)rect.Width()/(nMax-nMin);
    	rect.right=nPos*ratio;//计算进程条当前宽度
    	//////////////////////////////////////////////////////////////////////////
    // 	strRect.left =rect.left;
    // 	strRect.bottom =rect.bottom;
    // 	strRect.top = rect.top;
    // 	strRect.right = nPos*ratio;
    	//////////////////////////////////////////////////////////////////////////
    	bmp.DeleteObject();
    	bmp.LoadBitmap(IDB_BITMAP7);
    	bmp.GetBitmap(&bmpInfo);
    	memDC.SelectObject(&bmp);
    	BOOL  ret =dc.StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,0,0,
    		rect.Width(),rect.Height(),SRCCOPY);//画前景
    	bmp.DeleteObject();
    	double hratio=nMax/(double)100;
    	int hPos=nPos/hratio;//计算百分比值
    	CFont Font;
    	Font.CreatePointFont(150,_T("宋体"));
    	dc.SelectObject(&Font);
    	dc.SetTextColor(RGB(255,255,255));
    	CString str;
    	str.Format(_T("%d%%"),hPos);
    	dc.SetBkMode(TRANSPARENT);
    	dc.DrawText(str,strRect,DT_VCENTER|DT_CENTER);
    	memDC.DeleteDC();
    	Font.DeleteObject();
    }

    大家帮我看下。有什么问题?????????????

    2013年1月6日 11:14

答案

  • // ModifyStyle(0, BS_OWNERDRAW) ;
    ---------------------------------------------
    这个不对,BS_OWNERDRAW,是Button控件的属性。

    BS_OWNERDRAW
    Creates an owner-drawn button. The owner window receives a WM_DRAWITEM message when a visual aspect of the button has changed. Do not combine the BS_OWNERDRAW style with any other button styles.


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2013年1月6日 12:59
    版主

全部回复

  • // ModifyStyle(0, BS_OWNERDRAW) ;
    ---------------------------------------------
    这个不对,BS_OWNERDRAW,是Button控件的属性。

    BS_OWNERDRAW
    Creates an owner-drawn button. The owner window receives a WM_DRAWITEM message when a visual aspect of the button has changed. Do not combine the BS_OWNERDRAW style with any other button styles.


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2013年1月6日 12:59
    版主
  • 另外您的OnPaint函数中看看是否有GDI资源泄露的问题,因为我没有看到SelectObject原来的GDI对象。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2013年1月6日 13:01
    版主
  • 嗯。。 你说的对。
    2013年1月7日 2:18
  • 我没发现有资源泄露啊。。但是 在 多字节下 这些都是正常的,前景和背景都是成功的。但 UNICODE下 只有背景,而前景没有出来。。不知道为何?????????
    2013年1月7日 2:19
  • 有没有GDI资源泄露,您将任务管理器打开,看GDI是不是只增不减就知道有没有泄露的问题了。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2013年1月7日 2:26
    版主
  • 我找的原因了。。

    // 设置自绘
    ModifyStyle(0, BS_OWNERDRAW) ;
    。。。。。 BUTTON的自绘。我搞错了。。。。。。。。。。。。~~~谢谢。。

    2013年1月7日 2:37