狂菜问题:MFC中如何使用自定义的窗口类?

sunjx119 2003-11-22 03:59:59
rt。比如,如何重新设置客户区的背景色。
...全文
222 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
COOL099 2003-11-22
  • 打赏
  • 举报
回复
class CClientWnd : public CWnd
...
BOOL CClientWnd::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CRect rectbk;
CDC dcMen;
CBitmap bmbk;
bmbk.LoadBitmap(IDB_BITMAP1);
BITMAP stBitmap;
bmbk.GetObject(sizeof(BITMAP),&stBitmap);
CSize bmsize(stBitmap.bmWidth,stBitmap.bmHeight);
dcMen.CreateCompatibleDC(pDC);
CBitmap *pold=dcMen.SelectObject(&bmbk);
GetClientRect(&rectbk);
pDC->StretchBlt(rectbk.left,rectbk.top,rectbk.Width(),rectbk.Height(),&dcMen,0,0,bmsize.cx,bmsize.cy,SRCCOPY);
dcMen.SelectObject(pold);
dcMen.DeleteDC();
return true;
}

class CMainFrame : public CMDIFrameWnd
{
public:

CClientWnd m_wndClient;
....
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
...
m_wndClient.SubclassWindow(m_hWndMDIClient)
...
}
sunjx119 2003-11-22
  • 打赏
  • 举报
回复
谢谢楼上诸位高人指点,现在思路是有点了,可是具体怎么做还是很迷茫。
自己up...
COOL099 2003-11-22
  • 打赏
  • 举报
回复
自定義一個繼承自CWnd的類.
在它的OnEraseBkgnd里顯示圖片
在mdi框架oncreate里加入以下代碼
m_wndClient.SubclassWindow(m_hWndMDIClient) //m_wndClien是你自定義的類.
carbon107 2003-11-22
  • 打赏
  • 举报
回复
WNDCLASS结构是这样定义的:

typedef struct _WNDCLASS {

UINT style; //窗口的风格*

WNDPROC lpfnWndProc; //指定窗口的消息处理函数的远指针*

int cbClsExtra; //指定分配给窗口类结构之后的额外字节数*

int cbWndExtra; //指定分配给窗口实例之后的额外字节数

HANDLE hInstance; //指定窗口过程所对应的实例句柄*

HICON hIcon; //指定窗口的图标

HCURSOR hCursor; //指定窗口的鼠标

HBRUSH hbrBackground; //指定窗口的背景画刷

LPCTSTR lpszMenuName; //窗口的菜单资源名称

LPCTSTR lpszClassName; //该窗口类的名称*

} WNDCLASS;

////看下面
wc.style = CS_VREDRAW | CS_HREDRAW;

wc.lpfnWndProc = (WNDPROC)WinProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );

wc.hCursor = LoadCursor( NULL, IDC_ARROW );

wc.hbrBackground = GetStockObject(WHITE_BRUSH);

wc.lpszMenuName = NULL;

wc.lpszClassName = "EasyWin";

可以看到,wc.style被设为CS_VREDRAW | CS_HREDRAW,表示只要窗口的高度或宽度发生变化,都会重画整个窗口。


对于WNDCLASS结构,调用RegisterClass()函数进行注册;对于WNDCLASSEX结构,调用RegisterClassEx()函数进行注册,它们的原型分别如下:

ATOM RegisterClass( CONST WNDCLASS *lpWndClass );

ATOM RegisterClassEx( CONST WNDCLASSEX *lpwcx );

该函数如调用成功,则返回一个非0值,表明系统中已经注册了一个名为EasyWin的窗口类。如果失败,则返回0。


希望对你有所帮助
i54 2003-11-22
  • 打赏
  • 举报
回复
up
dzqsuper 2003-11-22
  • 打赏
  • 举报
回复
好像这个还是好复杂的
难是不难,只是步骤是好多哦
还要定义什么tabstring资源
关键是在应用程序类的InitInstance里面加代码
与下面的有点相像

CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_FDSAFDTYPE,
RUNTIME_CLASS(CFdsafdsafdsaDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CFdsafdsafdsaView));
AddDocTemplate(pDocTemplate);
saucer 2003-11-22
  • 打赏
  • 举报
回复
see

A Custom MDI Client Class
http://www.codeguru.com/doc_view/MDIClient.shtml
sunjx119 2003-11-22
  • 打赏
  • 举报
回复
用API函数AfxRegisterWndClass好象不管用
比如在函数BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)中我调用
AfxRegisterWndClass(0,0,
(HBRUSH)GetStockObject(BLACK_BRUSH),
::AfxGetApp()->LoadIcon(IDI_ICON1));
奇怪的是视窗图标可以被更改,但是背景却一点都不变,我晕啊...

然后尝试SDK里无所不能的SetWindowLong,
这样用他:SetClassLong(m_hWnd,GCL_HBRBACKGROUND,BLACK_BRUSH);
凡是可能起作用的地方都给他用上,什么
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct),
BOOL CMy123App::InitInstance(),
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs),
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs),都试过,可都不管用!
我快疯了,请高人指点,感激不尽!解决问题后立即结帖!


16,551

社区成员

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

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

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