MFC编写一个绘图程序

MFC编写一个绘图程序,第1张

同样的,我们可以编写其他菜单项的处理函数代码,其代码如下:

//PS_DASH菜单项处理函数

void CDrawTestView::OnPenDash()

{

// TODO: Add your command handler code here

m_PenStyle = PS_DASH;

this->SetMenuItemCheck(0,0,7,1);

}

//PS_DOT菜单项处理函数

void CDrawTestView::OnPenDot()

{

// TODO: Add your command handler code here

m_PenStyle = PS_DOT;

this->SetMenuItemCheck(0,0,7,2);

}

//PS_DASHDOT菜单项处理函数

void CDrawTestView::OnPenDashdot()

{

// TODO: Add your command handler code here

m_PenStyle = PS_DASHDOT;

this->SetMenuItemCheck(0,0,7,3);

}

//PS_DASHDOTDOT菜单项处理函数

void CDrawTestView::OnPenDashdotdot()

{

// TODO: Add your command handler code here

m_PenStyle = PS_DASHDOTDOT;

this->SetMenuItemCheck(0,0,7,4);

}

//PS_NULL菜单项处理函数

void CDrawTestView::OnPenNull()

{

// TODO: Add your command handler code here

m_PenStyle = PS_NULL;

this->SetMenuItemCheck(0,0,7,5);

}

//PS_INSIDEFRAME菜单项处理函数

void CDrawTestView::OnPenInsideframe()

{

// TODO: Add your command handler code here

m_PenStyle = PS_INSIDEFRAME;

this->SetMenuItemCheck(0,0,7,6);

}

//宽度1菜单项处理函数

void CDrawTestView::OnPen1()

{

// TODO: Add your command handler code here

m_PenWidth = 1;

this->SetMenuItemCheck(0,1,4,0);

}

//宽度3菜单项处理函数

void CDrawTestView::OnPen3()

{

// TODO: Add your command handler code here

m_PenWidth = 3;

this->SetMenuItemCheck(0,1,4,1);

}

//宽度5菜单项处理函数

void CDrawTestView::OnPen5()

{

// TODO: Add your command handler code here

m_PenWidth = 5;

this->SetMenuItemCheck(0,1,4,2);

}

//宽度7菜单项处理函数

void CDrawTestView::OnPen7()

{

// TODO: Add your command handler code here

m_PenWidth = 7;

this->SetMenuItemCheck(0,1,4,3);

}

//画笔颜色下黑色菜单项处理函数

void CDrawTestView::OnPenBlack()

{

// TODO: Add your command handler code here

m_PenColor = RGB(0,0,0);

this->SetMenuItemCheck(0,2,4,0);

}

//画笔颜色下红色菜单项处理函数

void CDrawTestView::OnPenRed()

{

// TODO: Add your command handler code here

m_PenColor = RGB(255,0,0);

this->SetMenuItemCheck(0,2,4,1);

}

//画笔颜色下绿色菜单项处理函数

void CDrawTestView::OnPenGreen()

{

// TODO: Add your command handler code here

m_PenColor = RGB(0,255,0);

this->SetMenuItemCheck(0,2,4,2);

}

//画笔颜色下蓝色菜单项处理函数

void CDrawTestView::OnPenBlue()

{

// TODO: Add your command handler code here

m_PenColor = RGB(0,0,255);

this->SetMenuItemCheck(0,2,4,3);

}

//None菜单项处理函数

void CDrawTestView::OnBrushNone()

{

// TODO: Add your command handler code here

m_BrushStyle = -1;

this->SetMenuItemCheck(1,0,7,0);

}

//HS_BDIAGONAL菜单项处理函数

void CDrawTestView::OnBrushBdiagonal()

{

// TODO: Add your command handler code here

m_BrushStyle = HS_BDIAGONAL;

this->SetMenuItemCheck(1,0,7,1);

}

//HS_CROSS菜单项处理函数

void CDrawTestView::OnBrushCross()

{

// TODO: Add your command handler code here

m_BrushStyle = HS_CROSS;

this->SetMenuItemCheck(1,0,7,2);

}

//HS_DIAGCROSS菜单项处理函数

void CDrawTestView::OnBrushDiagcross()

{

// TODO: Add your command handler code here

m_BrushStyle = HS_DIAGCROSS;

this->SetMenuItemCheck(1,0,7,3);

}

//HS_FDIAGONAL菜单项处理函数

void CDrawTestView::OnBrushFdiagonal()

{

// TODO: Add your command handler code here

m_BrushStyle = HS_FDIAGONAL;

this->SetMenuItemCheck(1,0,7,4);

}

//HS_HORIZONTAL菜单项处理函数

void CDrawTestView::OnBrushHorizontal()

{

// TODO: Add your command handler code here

m_BrushStyle = HS_HORIZONTAL;

this->SetMenuItemCheck(1,0,7,5);

}

//HS_VERITICAL菜单项处理函数

void CDrawTestView::OnBrushVertical()

{

// TODO: Add your command handler code here

m_BrushStyle = HS_VERTICAL;

this->SetMenuItemCheck(1,0,7,6);

}

//画刷颜色下白色菜单项处理函数

void CDrawTestView::OnBrushWhite()

{

// TODO: Add your command handler code here

m_BrushColor = RGB(255,255,255);

this->SetMenuItemCheck(1,1,4,0);

}

//画刷颜色下红色菜单项处理函数

void CDrawTestView::OnBrushRed()

{

// TODO: Add your command handler code here

m_BrushColor = RGB(255,0,0);

this->SetMenuItemCheck(1,1,4,1);

}

//画刷颜色下绿色菜单项处理函数

void CDrawTestView::OnBrushGreen()

{

// TODO: Add your command handler code here

m_BrushColor = RGB(0,255,0);

this->SetMenuItemCheck(1,1,4,2);

}

//画刷颜色下蓝色菜单项处理函数

void CDrawTestView::OnBrushBlue()

{

// TODO: Add your command handler code here

m_BrushColor = RGB(0,0,255);

this->SetMenuItemCheck(1,1,4,3);

}

我们在CDrawTestView类中再添加两个函数GetPen和GetBrush来获得自定义画笔和画刷指针,函数代码如下:

//获得自定义画笔指针

CPen CDrawTestView::GetPen()

{

return new CPen(m_PenStyle,m_PenWidth,m_PenColor);

}

//获得自定义画刷指针

CBrush CDrawTestView::GetBrush()

{

//判断是否是阴影线画刷

if (m_BrushStyle == -1)

//不是阴影线画刷

return new CBrush(m_BrushColor);

else

//是阴影线画刷

return new CBrush(m_BrushStyle,m_BrushColor);

}

编写这两个函数的好处在于:如果以后需要更改获得画笔或者画刷的方式(比如画笔改用第三个构造函数来构造),只需要修改这两个函数即可。如果在每个绘图函数菜单项的处理函数中写构造画笔和画刷的代码,一旦画笔和画刷的构造方式要发生改变,就必须逐个修改每个绘图函数菜单项的处理函数。

现在修改绘图函数菜单项的处理函数,调用GetPen和GetBrush函数获得画笔和画刷,然后选用画笔和画刷,并在函数的最后删除画笔和画刷。这是因为获得画笔和画刷的函数每次都是构造新的画笔和画刷,而它们将占用系统资源,所以在使用完毕后要进行删除。而LineTo等绘制线形图形的绘图函数不受画刷影响,所以在这些绘图函数的处理函数中不需要选用画刷。因为所有线形图形绘图函数菜单项的处理函数要添加的代码是相同的,同样所有区域图形绘图函数菜单项的处理函数要添加的代码也是相同的,所以这里只列出“LineTo”(绘制线形图形)菜单项和“Rectangle”(绘制区域图形)菜单项修改后的处理函数代码,读者只需按照相同方法修改其它处理函数即可。修改后的代码如下:

//LineTo菜单项处理函数

void CDrawTestView::OnDrawLineto()

{

// TODO: Add your command handler code here

CClientDC dc(this);

CPen pen = this->GetPen();

dcSelectObject(pen);

dcMoveTo(300,300);

dcLineTo(400,400);

pen->DeleteObject();

}

//Rectangle菜单项处理函数

void CDrawTestView::OnDrawRectangle()

{

// TODO: Add your command handler code here

CClientDC dc(this);

CPen pen = this->GetPen();

CBrush brush = this->GetBrush();

dcSelectObject(pen);

dcSelectObject(brush);

dcRectangle(450,100,650,250);

pen->DeleteObject();

brush->DeleteObject();

}

代码中粗体字部分是后添加的代码,修改原则是在获得设备环境对象之后,调用绘图函数之前,先获得画笔或画笔和画刷,然后让设备环境对象选用它们。最后在所有绘图函数执行完后,删除前面获得的画笔或画笔和画刷。

下面我们看一个例子,修改OnDraw函数,输入如下代码:

void CDrawTestView::OnDraw(CDC pDC)

{

CDrawTestDoc pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

//构造要输出的文本字符串

CString s;

s = "DrawTest Function";

//构造文本要输出的矩形区域

CRect r;

rleft = 50;rright =150;

rtop =10;rbottom = 40;

//绘制矩形,以便确定输出的文本在矩形区域中的位置

pDC->Rectangle(r);

//水平,垂直方向都居中,单行显示,超出区域范围不剪切

pDC->DrawText(s,r,DT_VCENTER|DT_CENTER|DT_SINGLELINE|DT_NOCLIP);

//向下平移矩形区域

rtop = rtop + 50;rbottom = rbottom +50;

pDC->Rectangle(r);

//垂直方向居底,水平方向靠右,单行显示

pDC->DrawText(s,r,DT_BOTTOM|DT_RIGHT|DT_SINGLELINE);

//向下平移矩形区域

rtop = rtop + 50;rbottom = rbottom +50;

pDC->Rectangle(r);

//垂直方向居顶,水平方向靠左,超出矩形区域时,在单词之间换行

pDC->DrawText(s,r,DT_TOP|DT_LEFT|DT_WORDBREAK);

//向下平移矩形区域

rtop = rtop + 50;rbottom = rbottom +50;

pDC->Rectangle(r);

//垂直方向居中,水平方向靠左,单行显示,超出范围时用省略号取代字符串尾部字符

pDC->DrawText(s,r,

DT_VCENTER|DT_LEFT|DT_SINGLELINE|DT_END_ELLIPSIS);

}

楼上方法可行,但由于MFC中有多个图标在不同的状态下使用,如在windows资源管理器中不同显示模式时的大图标、小图标,在你的MFC应用程序主框架窗体标题拦里显示的图标,在你主视窗view标题拦里显示的图标都可以不同(向导默认是相同的图标),因此,VC中比较正规的做法是你点击应用程序工程项目->资源文件夹-> 工程文件名rc ->icon,在里面有不同情况下的大小icon,你可以直接点击打开图形编辑修改图标,或从其他文件导入来改变你的程序图标。 另外,你可以在此增加任何新的iocn资源,编辑或导入图形,这些资源都会有个ID,你可以用这个ID在程序中加载使用这些图标。 在这里编辑更新的图标,你编译时会自动编译这个rc文件,并将这些图标自动嵌入你的执行文件里。 除此之外,你的程序还可以通过特定的ID直接使用windows系统内置的ICON,这些ICON的ID你可以通过查阅相关手册,使用系统内置资源的好处是,它是共享资源,不会占用物理空间。

MFC单文档程序,在资源编辑器中只有一个已有的toolbar资源,你只需要在资源编辑器里面,通过“空位”建立一个按钮图标(通过绘制或者复制)并加工好,然后选中这个

工具条

按钮,右键属性,给予它一个ID就可以使用了。

ID最好是先建立菜单项的方式给予,这样方便建立提示说明等文字。

工具条按钮,不需要SetButton方法,这个是对话框按钮控件的方式,而不是工具条按钮。

你的工程文件下有个res文件夹。

自己制作程序图标 或者 由工具生成图标,替换res文件夹的图标,重新debug或者release就可以了。

注意替换的时候名字改为一致的。

try this code:

BOOL CMainFrame::OnShowPopupMenu(CMFCPopupMenu pMenuPopup)

{

if(pMenuPopup)

{

int iIndex = -1;

CMFCPopupMenuBar pMenuBar = pMenuPopup->GetMenuBar();

if (!CMFCToolBar::IsCustomizeMode()&& (NULL != pMenuBar) && (iIndex=pMenuBar->CommandToIndex(ID_EDIT_PASTE))>=0)

{

pMenuPopup->InsertSeparator(iIndex+1);

pMenuPopup->InsertItem(CMFCToolBarMenuButton(IDS_EDIT_MYITEM_1,NULL,-1,_T("&MyItem 1")),iIndex+2);

pMenuPopup->InsertItem(CMFCToolBarMenuButton(IDS_EDIT_MYITEM_1 + 1,NULL,-1,_T("&MyItem 2")),iIndex+3);

}

}

return TRUE;

}

主窗口的图标吗?

1通过Insert/Resource命令插入Icon图标资源(我这里把ID设为IDI_MY_ICON),画图

2在cpp文件的InitInstance()函数中加入下列代码(在最后找到m_pMainWnd->

ShowWindow

(SW_SHOW);m_pMainWnd->

UpdateWindow

();加在他们前面)

HICON

hIcon=

AfxGetApp

()->LoadIcon(IDI_MY_ICON);

m_pMainWnd->SetIcon(hIcon,TRUE);

m_pMainWnd->SetIcon(hIcon,FALSE);

然后在

任务栏

显示的图标就改变了,当然,也可以在Icon中找到原图标,然后直接在原图标上修改啊,不过,这个太偷懒了

以上就是关于MFC编写一个绘图程序全部的内容,包括:MFC编写一个绘图程序、Visual C++ 6.0 里MFC中 要改变 程序图片(不要默认的应用程序图标)怎么添加 或 改变、MFC 单文档添加自定义位图工具栏图标等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9673972.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存