CDC *pDC=GetDC()画图的一些问题

用VC6建立一个基于对话框的MFC程序
在窗口上加一个按钮,按钮的OnButton1命令响应函数里写Invalidate();UpdateWindow();
即单击按钮刷新窗口
在OnPaint函数里写入以下代码:
static int i=0;
CDC *pDC=GetDC();
if(i==1)
pDC->Rectangle(0,0,100,100);
i++;
ReleaseDC(pDC);
整个程序功能应该是当程序运行后只有第一次单击按钮时才会画矩形
但是程序没有实现上述功能,这是为什么?
假如我在CDC *pDC=GetDC()下加上一句CPaintDC dc(this)后
程序又能实现只有第一次单击按钮才画矩形的情况,这又是为什么?
我实在找不出原因
请高手回答以上2个问题
谢谢

第1个回答  推荐于2016-12-02
你如何添加的 ,是不是下面这样子,没问题啊
void CTestzhidaodlgDlg::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
{
CDialog::OnPaint();
}
static int i=0;
CDC *pDC=GetDC();
if(i==1)
pDC->Rectangle(0,0,100,100);
i++;
ReleaseDC(pDC);

}追问

我是加在最开头的,也试过加在else里面都不行
但是你的却可以
这又是为什么

追答

必须放在if else 后门,因为在if 和else 里面是处理对话框一些初始化的代码,没有这些代码,后续工作无法进行。注意以后加代码都加在后面, 一般不是会提示你 请在这下面加代码

本回答被提问者采纳
第2个回答  2011-04-23
很好的问题,在这里你这CDC*c=::beginpaint(PAiNTSTRuCT结构体);
结束代替为::EndPaint(一样的结构体),也能实现该功能,问题是这里是,在响应wm_paint消息不用这些getdc()函数,可视在其他情况都可以,而是像上面那样,或者CPaint()
第3个回答  2011-04-23
在相应WM_PAINT消息时,如果想得到DC句柄,只能调用BeginPaint,而不能用GetDC
在按钮的OnButton1命令响应函数里写Invalidate(); 在OnPaint函数中的else模块中
{
//CDialog::OnPaint();
CPaintDC dc(this);
static int i=0;
if(i==1)
dc.Rectangle(0,0,100,100);
i++;
}
第4个回答  2011-04-23
估计是画刷的原因,你选一种与背景色不同的画刷试试。
第5个回答  2018-12-02
把条件语句if(i==1)改成if(i%2==1)不就OK了,看了一下你们的评论,没一个回答到点子上,真是让我失望之极,这么简单的问题还搞这么复杂,有时候我真不知道你们是干什么吃的,脑子真是长屁股里了

CDC *pDC=GetDC()画图的一些问题
static int i=0;CDC *pDC=GetDC();if(i==1)pDC->Rectangle(0,0,100,100);i++;ReleaseDC(pDC);}

CView某个函数里加入CDC* pDC=GetDC()后画图,为什么界面大小一变图就...
界面大小改变,会发送窗口区无效的命令,也就是WM_PAINT,然后会导致窗口进行重绘。然后系统响应这个消息的顺序通常是:先调用OnPaint(消息处理函数),然后在OnPaint里面调用OnDraw(不是消息相应函数)函数,所以如果你想让窗口改变以后你的图像还在,那么你应该讲绘图的命令写在OnDraw函数里面,或者说干脆...

CDC *pDC=GetDC();具体是什么意思?
CDC *pDC=GetDC() 返回GetDC()获取的CDC对象。后就就可以对该对象进行操作 【注】这里的GetDC()是CWnd的成员函数,其返回值是一个CDC的指针,并把这个返回值存在pDC这个指针变量里。CDC是一个关于DC的类,其中封装了与DC操作相关的一系列操作。GetDC()这个函数是用来从窗口客户区中获取一个DC来...

mfc 绘图问题
C**View ::***(){ CDC *pDC;pDC=GetDC();pDC->Ellipse(10,10,10,10);ReleaseDC(pDC);} 本人初学,一同学习,共同进步 QQ631496417

CDC *pDC=GetDC();pDC->TextOut();ReleaseDC(pDC);是实现什么功能_百度...
简单地说,GetDC()可以获取当前显示设备的一些属性,这些属性放在一个结构里,pDC指向该结构.pDC->TextOut就是使用该结构的显示方面的属性来显示一段字符串.ReleaseDC(pDC);显示的工作做完了,释放这个结构.

VC 解释一下CDC *pDC=pWnd->GetDC();
CDC *pDC=pWnd->GetDC();1.用CDC(MFC的设备上下文)实例化一个对象的指针 2.为这个对象的指针赋值为pWnd 3.pWnd被赋值为GetDC.相当于用API的DC实例化一个对象的指针pWnd 小结:用MFC的设备上下文实列化一个指针的对象,这个指针对象的值来源于API的设备上下文实例化。=== 实际上,MFC的大多...

CDC *pDC=GetDC();
这个函数明明没有参数---你是怎么确定的???首先:计算机一般是不会骗人的,信你还是信计算机?我信计算机!看看最原始的函数原型:HDC GetDC(HWND hWnd \/\/ handle to window );你的GetDC()写在不同的地方有不同的含义,你学了类的概念就知道了。

为什么我从文本中读取点坐标,然后绘图,但结果没有显示点?
我觉得是这里有问题:CDC *pDC=new CDC();可能是pDC没有和任何设备关联的缘故。如果是在View类里的话,一般不是用CClientDC dc( this )吗?或者也可以用CDC *pDC = GetDC();

关于CDC类的问题
你的代码里没有使用画笔声明的代码啊。画笔应该这样使用:void CDraw3View::OnDraw(CDC* pDC){ CDraw3Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);\/\/ TODO: add draw code for native data here \/\/pDC=GetDC();\/\/使用系统的笔不会错 CPen *oldPen ;\/\/保存旧画笔的指针 CPen mypen(...

MFC 对话框的矩形区域内画图
y,宽度是Width,高度是Height :CDC* pDC=GetDC();CDC mdc;mdc.CreateCompatibleDC(pDC);\/\/创建内存DC;CBitmap bmp;bmp.CreateCompatibleBitmap(pDC,Width,Height);mdc.SelectObject(&bmp);\/\/然后开始在mdc上绘图 pDC->BitBlt(x,y,Width,Height,&mdc,0,0,SRCCOPY);\/\/绘完之后拷贝到pDC上 ...

相似回答