在SDI MFC应用程序中使用OnNcPaint绘制主机(非客户原因)中的问题 [英] Problem in Painting Mainframe (non client reason) using OnNcPaint in SDI MFC application

查看:67
本文介绍了在SDI MFC应用程序中使用OnNcPaint绘制主机(非客户原因)中的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经开始使用新的SDI MFC应用程序(CScroolView)。我想改变大型机的颜色,我通过这样做得到了一个解决方案

1.在消息处理程序中添加了ON_WN_NCPAINT

2.添加了afx_msg void OnNcPaint(); 在MainFrm.h中

3.我在MainFrm.cpp中推翻了该函数,如下所示



 CDC * pWinDC = GetWindowDC(); 
CRect rect;
GetWindowRect(& rect);
ScreenToClient(& rect);
CRect rectClient;
GetClientRect(& rectClient);
rectClient.OffsetRect(-rect.left,-rect.top);
rect.OffsetRect(-rect.left,-rect.top);
pWinDC-> ExcludeClipRect(& rectClient);
// 在这里做点什么...
CBrush backBrush(RGB(< span class =code-digit> 255 , 255 255 ));
CBrush * pOldBrush = pWinDC-> SelectObject(& backBrush);
pWinDC-> SelectObject(pOldBrush);
// ................
pWinDC-> SelectClipRgn(NULL);
ReleaseDC(pWinDC);



因此它改变了主框架颜色。



但是之后我得到了这个问题............



1)如果我想将主框架的颜色改为任何其他颜色在上面的代码中改变RGB值它没有发生........... ??????????

2)即使我评论所有代码也没有改变.....(以前彩色框架即将推出)



如果我评论ON_WN_NCPAINT那么它会给出默认主机(微软提供)



所以发生了什么我根本没有得到........................................



因为我们将在消息处理程序中写入ON_WN_NCPAINT以执行OnNcPaint()函数,即使我还没有在其中编写任何代码,因为之前绘制的大型机即将到来...........



请帮助我这里发生的事情.........



感谢您的光临如果可能,请在阅读我的问题时请给我建议解决/理解问题.....................

解决方案
嘿!我注意到你总是说ON_W N _NCPAINT函数。当然它应该是ON_W M _NCPAINT,M注意你。这是否能解决任何问题或者这只是一个错字?



我能想到的另一个问题是这个ON_WM_NCPAINT消息首先不会被触发。所以你必须这样做你自己通过调用SetWindowPos与SWP_DRAWFRAME标志


嗨Krupakar,

上面的代码已经出现问题..相同的代码我用过,我遇到了同样的问题...然后我写下了代码并解决了问题。

1.你必须在OnNcPaint()中编写相同的代码。

2然后你必须在OnNcActivate()旁边调用OnNcPaint()函数...



CRect rect;

GetClientRect(rect);

CDC * dc;

int x,y;

CRect rc1,rc2;

dc = GetWindowDC( );

GetWindowRect((LPRECT)&rc2);



//计算标题栏的这个窗口有一个系统框

//最小化框,最大化框,并有一个可调整大小的框架



x = GetSystemMetrics( SM_CXSIZE)+

GetSystemMetrics(SM_CXBORDER)+

GetSystemMetrics(SM_CXFRAME);

y = GetSystemMetrics(SM_CYFRAME);

rc1.left = 0;

rc1.top = y;



// 2 * x给出两倍的位图+边框+框架尺寸。由于

//只有两个位图,两个边框,以及

//标题栏末尾的一帧,所以减去一个框架来解释这个问题。 br $>


rc1.right = rc2.right - GetSystemMetrics(SM_CXFRAME);

rc1.bottom = GetSystemMetrics(SM_CYSIZE)+5;



CRect recta;

GetClientRect(recta);



CPen myPen;

myPen.CreatePen(PS_SOLID,1,STYLE_BLACK);

CPen * oldPen = dc-> SelectObject(&myPen);



int lowerEnd = recta.bottom + 30;

int lower_border = recta.bottom + 30;

int left_border = 15;

int right_border = recta.bottom + 30;



CRect rctest;

GetWindowRect(&rctest);

ScreenToClient(&rctest);

//绘制顶部边框[标题栏]

for(int i = rc1.top-8; i< = rc1.bottom + 5 ; i ++)

{

dc-> MoveTo(0,i);

dc-> LineTo(rctest.rig ht + right_border,i);

dc-> SelectObject(&myPen);

}

//画左边界

for(int i = rc1.bottom; i< = lowerEnd; i ++)

{

dc-> MoveTo(0,i);

dc-> LineTo( left_border,i);

dc-> SelectObject(&myPen);

}

//画右边框

for(int i = rc1.bottom; i< = lowerEnd; i ++)

{

dc-> MoveTo(recta.right + 2,i) ;

dc-> LineTo(recta.right + 2 + right_border,i);

dc-> SelectObject(&myPen);

}





for(int i = lowerEnd-2; i< = lowerEnd + lower_border; i ++)

{

dc-> MoveTo(0,i);

dc-> LineTo(recta.right + 2 + right_border,i);

dc-> SelectObject(&myPen);

}

dc-> SelectObject(oldPen);


< blockquote> < pre lang =c ++>< big>< / big>< / pre> < a href =>< / a>< a href =>< / a> [< a href =target =_ blank>< / a>]

I have started new SDI MFC application (CScroolView). I want to change the color of mainframe, I got one solution for that by doing
1. Added ON_WN_NCPAINT in message handler
2. Added "afx_msg void OnNcPaint( );" in MainFrm.h
3. I overtraded the function in MainFrm.cpp as follows

CDC* pWinDC = GetWindowDC();
	CRect rect;
	GetWindowRect(&rect);
	ScreenToClient(&rect);
	CRect rectClient;
	GetClientRect(&rectClient);
	rectClient.OffsetRect(-rect.left, -rect.top);
	rect.OffsetRect(-rect.left, -rect.top);
	pWinDC->ExcludeClipRect(&rectClient);
	// do stuff here...
	CBrush backBrush(RGB(255,255,255));
	CBrush* pOldBrush = pWinDC->SelectObject(&backBrush);
	pWinDC->SelectObject(pOldBrush);
	// ................
	pWinDC->SelectClipRgn(NULL);
    	ReleaseDC(pWinDC);


So it changed the main frame color.

But after this I got the problem............

1) If I want to change the color of main frame to any other color by changing RGB values in the above code it’s not happening...........???????????
2) Even if I comment all code also no change.....(Previously colored frame is coming)

If I comment ON_WN_NCPAINT then it’s giving default mainframe (Microsoft providing)

So what is happening I am not getting at all ………………………………….

Because we will write ON_WN_NCPAINT in message handler to execute OnNcPaint( ) function even though I haven’t written any code inside this how it’s coming as previously painted mainframe is coming...........

Please help me what is happening inside this.........

Thanks for having patience in reading my problem if possible please give me suggestion to solve/ understand the problem.....................

解决方案

Hey! I noticed you always speak of an "ON_WN_NCPAINT function. Of course it's ought to be "ON_WM_NCPAINT", with 'M' mind you. Does this solve anything or was that just a typo?

One other problem I could think of is that this ON_WM_NCPAINT message doesn't get fired in the first place. So you got to do it yourself by calling "SetWindowPos with the SWP_DRAWFRAME flag"


Hi Krupakar,
the above code has come problem..same code i used and i got same problem ...then i wrote down code and the problem solved.
1.You have to write same code in OnNcPaint().
2.Then u have to call OnNcPaint()function in side OnNcActivate()...

CRect rect;
GetClientRect(rect);
CDC* dc;
int x,y;
CRect rc1,rc2;
dc = GetWindowDC( );
GetWindowRect((LPRECT)&rc2 );

// Compute the caption bar's origin. This window has a system box
// a minimize box, a maximize box, and has a resizeable frame

x = GetSystemMetrics( SM_CXSIZE ) +
GetSystemMetrics( SM_CXBORDER ) +
GetSystemMetrics( SM_CXFRAME );
y = GetSystemMetrics( SM_CYFRAME );
rc1.left = 0;
rc1.top = y;

// 2*x gives twice the bitmap+border+frame size. Since there are
// only two bitmaps, two borders, and one frame at the end of the
// caption bar, subtract a frame to account for this.

rc1.right = rc2.right - GetSystemMetrics( SM_CXFRAME );
rc1.bottom = GetSystemMetrics( SM_CYSIZE )+5;

CRect recta;
GetClientRect(recta);

CPen myPen;
myPen.CreatePen(PS_SOLID, 1,STYLE_BLACK);
CPen *oldPen = dc->SelectObject(&myPen) ;

int lowerEnd = recta.bottom+30;
int lower_border=recta.bottom+30;
int left_border=15;
int right_border=recta.bottom+30;

CRect rctest;
GetWindowRect(&rctest);
ScreenToClient(&rctest);
// draw top border [title bar]
for(int i = rc1.top-8 ; i <= rc1.bottom+5;i++)
{
dc->MoveTo(0, i);
dc->LineTo(rctest.right + right_border, i);
dc->SelectObject (&myPen);
}
// draw left border
for(int i = rc1.bottom ; i <= lowerEnd;i++)
{
dc->MoveTo(0, i);
dc->LineTo(left_border, i);
dc->SelectObject (&myPen);
}
// draw right border
for(int i = rc1.bottom ; i <= lowerEnd;i++)
{
dc->MoveTo(recta.right+2, i);
dc->LineTo(recta.right+2+right_border, i);
dc->SelectObject (&myPen);
}


for(int i = lowerEnd-2 ; i <= lowerEnd + lower_border; i++)
{
dc->MoveTo(0, i);
dc->LineTo(recta.right+2+right_border, i);
dc->SelectObject (&myPen);
}
dc->SelectObject(oldPen) ;


<pre lang="c++"><big></big></pre> <a href=""></a><a href=""></a>[<a href="" target="_blank"></a>]


这篇关于在SDI MFC应用程序中使用OnNcPaint绘制主机(非客户原因)中的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆