利用缓冲在picture上绘图

lgytj 2004-01-02 08:20:24
我的代码如下,但运行后一个也没画出来,各位帮我看看什么问题,十分感谢
///////////////////////////////////////////////////////
CDC *pDC = m_drawbox.GetDC();
CDC dcMem;
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC,300,300);
dcMem.CreateCompatibleDC(pDC);
CBitmap *pOld = dcMem.SelectObject(&bitmap);

dcMem.FillRect(CRect(0,0,300,300),(CBrush *)dcMem.SelectStockObject(WHITE_BRUSH));
RECT *pRect=new RECT;
m_drawbox.GetClientRect(pRect);
dcMem.Rectangle(pRect);
POINT *pP=new POINT;
pP->x=(pRect->bottom+pRect->top)/2;
pP->y=(pRect->left+pRect->right)/2;
ClientToScreen(pP); //这两句需要吗?
//ScreenToClient(pP);
dcMem.LineTo(*pP);
dcMem.TextOut(pP->x,pP->y,"111111");

pDC->BitBlt(0,0,300,300,&dcMem,0,0,SRCCOPY);
bitmap.DeleteObject();
m_drawbox.ReleaseDC(pDC);
delete pP;
delete pRect;

//////////////////////////////////
...全文
74 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
lambochan 2004-01-02
  • 打赏
  • 举报
回复
不是,那是个botton,用来看看效果的(按了才显示),呵呵..
实际没作用的..
broadoceans 2004-01-02
  • 打赏
  • 举报
回复
to: lambochan(打杂)
其实你的
void COKDlg::OnButton1()
根本就没有用。
去掉它是一样的。

zswzwy 2004-01-02
  • 打赏
  • 举报
回复
很明显,代码没问题,只是被刷新掉了。
lgytj 2004-01-02
  • 打赏
  • 举报
回复
谢谢了,结贴!
lambochan 2004-01-02
  • 打赏
  • 举报
回复
放OnPaint()..
============================
void COKDlg::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
{
Draw();
CDialog::OnPaint();
}
}

void COKDlg::OnButton1()
{
// TODO: Add your control notification handler code here
Draw();

}

void COKDlg::Draw()
{
CWnd *pWnd = GetDlgItem(IDC_XXXX);
CDC *pDC = pWnd->GetDC();

CDC dcMem;
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC,300,300);
dcMem.CreateCompatibleDC(pDC);
CBitmap *pOld = dcMem.SelectObject(&bitmap);

dcMem.FillRect(CRect(0,0,300,300),(CBrush *)dcMem.SelectStockObject(WHITE_BRUSH));
RECT *pRect=new RECT;
pWnd->GetClientRect(pRect);//这样GetClientRect
dcMem.Rectangle(pRect);
POINT *pP=new POINT;
pP->x=(pRect->bottom+pRect->top)/2;
pP->y=(pRect->left+pRect->right)/2;
//ClientToScreen(pP); //这两句需要吗?//这两句不需要
//ScreenToClient(pP);
dcMem.LineTo(*pP);
dcMem.TextOut(pP->x,pP->y,"111111");
pDC->BitBlt(0,0,pRect->right,pRect->bottom,&dcMem,0,0,SRCCOPY);

pWnd->ReleaseDC(pDC);//这样释放..
dcMem.SelectObject(pOld);
bitmap.DeleteObject();
dcMem.DeleteDC();

}
==============================================================

这样就OK~
lgytj 2004-01-02
  • 打赏
  • 举报
回复
谢了兄弟,我是把这部分代码放在OnInitDialog()中了,不知为什么就不行,呵呵
lambochan 2004-01-02
  • 打赏
  • 举报
回复
发了,试试看吧,代码和上面的一样,呵呵..
lgytj 2004-01-02
  • 打赏
  • 举报
回复
lambochan(打杂)
大哥,俺虽然笨了点,但也没那么夸张,当然改了,我的是“IDC_PIC”
得,麻烦你老方便的话手头调调,要能成功也给我发份吧,信箱同上:)
broadoceans 2004-01-02
  • 打赏
  • 举报
回复
我班上有,现在不能给你。
lambochan 2004-01-02
  • 打赏
  • 举报
回复
我给你~~现成的
等等..
lambochan 2004-01-02
  • 打赏
  • 举报
回复
当然OK啦~~
你那个picture控件ID是什么啊?GetDlgItem(pictureID),不是IDD_XXXX噢.呵呵.
lgytj 2004-01-02
  • 打赏
  • 举报
回复
broadoceans(broadoceans)
你有现成的调试成功的代码吗?能给我发一分吗?我今天这个问题搞了一天,愁死了:(
信箱lgytj@163.com
broadoceans 2004-01-02
  • 打赏
  • 举报
回复
这就奇怪了,我以前一直是这么用的。
lgytj 2004-01-02
  • 打赏
  • 举报
回复
broadoceans(broadoceans)
我按你的代码写了一下,有些地方作了修改,但还是没结果:(
///////////////////////////////////////////////////////
HDC hdc = ::GetDC(m_drawbox.m_hWnd);
HDC memhdc = ::CreateCompatibleDC(hdc);
::SetTextColor(memhdc,RGB(255,0,0));
::TextOut(memhdc,0,0,"Hello",5);
::BitBlt(hdc,0,0,100,100,memhdc , 0 , 0 , SRCCOPY);
::DeleteDC(memhdc);
::ReleaseDC(m_drawbox.m_hWnd,hdc);
m_drawbox.Invalidate();
/////////////////////////////////////////////////////////////
lambochan(打杂)
我按你改动的代码考进去也是没效果,你在自己的vc里这样写成功了吗?
lambochan 2004-01-02
  • 打赏
  • 举报
回复
容易啦,用API反而麻烦~参数一大堆..

如果是控件:用GetDlgItem(IDD_XXXXX)获取picture控件ID,然后喜欢怎么画就怎么画~~

参照代码:
CWnd *pWnd = GetDlgItem(IDD_XXXX);//获取控件窗口指针.
CDC *pDC = pWnd->GetDC();//这样GetDC();
然后就抄你的了:
CDC dcMem;
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC,300,300);
dcMem.CreateCompatibleDC(pDC);
CBitmap *pOld = dcMem.SelectObject(&bitmap);

dcMem.FillRect(CRect(0,0,300,300),(CBrush *)dcMem.SelectStockObject(WHITE_BRUSH));
RECT *pRect=new RECT;
pWnd->GetClientRect(pRect);//这样GetClientRect
dcMem.Rectangle(pRect);
POINT *pP=new POINT;
pP->x=(pRect->bottom+pRect->top)/2;
pP->y=(pRect->left+pRect->right)/2;
//ClientToScreen(pP); //这两句需要吗?//这两句不需要
//ScreenToClient(pP);
dcMem.LineTo(*pP);
dcMem.TextOut(pP->x,pP->y,"111111");
pDC->BitBlt(0,0,300,300,&dcMem,0,0,SRCCOPY);

pWnd->ReleaseDC(pDC);//这样释放..
broadoceans 2004-01-02
  • 打赏
  • 举报
回复
查一下msdn
这是学vc的基本功。
你先试两句吧
HDC hdc = ::GetDC(m_drawbox.m_hWnd);
HDC memhdc = ::CreateCompatibleDC(hdc);
SetTextColor(RGB(255,0,0));
::TextOut(memhdc,0,0,"Hello",5);
::BitBlt(hdc,0,0,100,100,memhdc , 0 , 0 , SRCCOPY);
::DeleteDC(memhdc);
::ReleaseDC(hdc);
m_drawbox.Invalidete();


lgytj 2004-01-02
  • 打赏
  • 举报
回复
picture是控件
api我不怎么懂,麻烦你能帮我改写一下吗?我也试试学习一下,谢谢了:)
broadoceans 2004-01-02
  • 打赏
  • 举报
回复
我以前使用win32api做的,总能成功。
你改一下吧。
HDC hdc = ::GetDC(m_drawbox.m_hWnd);
HDC memhdc = ::CreateCompatibleDC(hdc);
::BitBlt
::TextOut
全部改为win32 api试一试。
你先把原来的注释掉,
复制一份改一下。
lambochan 2004-01-02
  • 打赏
  • 举报
回复
楼主的picture是什么DD来的?控件?
lgytj 2004-01-02
  • 打赏
  • 举报
回复
m_drawbox什么都没有,就是创建时的样子
pDC->BitBlt(0,0,300,300,&dcMem,0,0,SRCCOPY);返回值为1
返回成功了
加载更多回复(13)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧