博文

[ZT]VC小技巧(3)(2006-11-30 09:12:00)

摘要:(51) 如何访问预定义的GDI对象
可以通过调用CDC:: SlectStockObject使用Windows的几个预定义的对象,诸如刷子、笔以及字体。下例使用了Windows预定义的笔和刷子GDI对象在视窗中画一个椭圆。
//Draw ellipse using stock black pen and gray brush.
void CSampleView:: OnDraw (CDC* pDC)
{
//Determine size of view.
CRect rcView
GetClientRect (rcView) //Use stock black pen and stock gray brush to draw ellipse.
pDC->SelectStockObject (BLACK_PEN)
pDC->SelectStockObject (GRAY_BRUSH)
//Draw the ellipse.
pDC->Ellipse (reView)
} 也可以调用新的SDK函数GetSysColorBrush获取一个系统颜色刷子,下例用背景色在视窗中画一个椭圆:
void CsampleView:: OnDraw (CDC* pDC)
{
//Determine size of view.
CRect rcView
GetClientRect (rcView) //Use background color for tooltips brush.
CBrush * pOrgBrush=pDC->SelectObject ( CBrush ::FromHandle( ::GetSysColorBrush (COLOR_INFOBK))) //Draw the ellipse.
pDC->Ellipse (rcView) //Restore original brush.
pDC->SelectObject (pOrgBrush)
} (52) 如何获取GDI对象的属性信息
可以调用GDIObject:: GetObject。这个函数将指定图表设备的消息写入到缓冲区。下例创建了......

阅读全文(6287) | 评论:0

[ZT]VC小技巧(4)(2006-11-30 09:08:00)

摘要:(76) 我在我的程序中是了CDWordArray。我向它添加了约10,000个整数,这使得它变得非常非常慢。为什么会这么糟?
CDWordArray 是 很 好 用 的,只 是 因 为 你 没 有 指 定 数 组 的最大尺寸。因 此,当 你 添 加 新 元 素 时,该 类 会 从 堆 中 重 新 分 配 空 间。不 幸 的 是,该 类 会 在 每 次 插 入 新 元 素 时 都 为 数 组 重 新 分 配 空 间。如 果 你 向 它 添 加 了 很 多 新 元 素,所 有 这 些 分 配 和 复 制 数 组 的 操 作 会 就 会 使 它 变 慢。解 决 该 问 题 的 方 法 是,你 可 以 使 用 SetSize 函 数 的 第 二 个 参 数 来 改 变 这 种 重 新 分 配 的 频 率。例 如,如 果 你 把 该 参 数 设 置 为 500,则 每 次 数 组 空 间 超 出 时 它 才 重 新 分 配 并 添 加 500 个 新 空 间,而 不 是 1 个。这 样 一 来,你 就 可 以 不 用 重 新 分 配 而 添 加 了 另 外 499 个 元 素 空 间,这 也 会 大 大 提 高 程 序 的 运 行 速 度。
(77) 我该如何改变MDI框架窗口的子窗口的大小以使在窗口以一定的大小打开?
在 视 中 的 OnInitialUpdate 函 数 中 调 用 GetParentFrame 函 数。GetParentFrame 会 返 回 一 指 向 一 保 存 有 该 视 的 框 架 窗 口 的 指 针。然 后 调 用 在 框 架 窗 口 上 调 用 MoveWindow。 (78) 在我的程序的某些部分,我可以调用 MessageBox 函数来建立一个信息对话框,例如在视类中。但是,在其它部分我却不能,如文档类中。为什么?我怎样才能在我的应用程序类中建立一个信息对话框?
MessageBox 函 数 来 自 CWnd 类,所 以 你 只 能 在 从 CWnd 继 承 的 类 ( 如 CView ) 中 调 用 它。但 是,MFC 也 提 供 了 AfxMessageBox 函 数,你 可 以 在 任 何 地 方 调 用 它。
(79) 我需要在我的程序中设置全局变量,以使文档中的所有类都能访问。我应该吧它......

阅读全文(4026) | 评论:0

关于线程的同步(2006-11-29 16:39:00)

摘要:看到几篇好文,关于线程同步的,试一下怎样引用,留着以后需要用。 《多线程同步技术》 http://blog.programfan.com/article.asp?id=10899 http://blog.programfan.com/article.asp?id=10900 http://blog.programfan.com/article.asp?id=10901 http://blog.programfan.com/article.asp?id=10902......

阅读全文(2772) | 评论:0

笔记:在vc++的MFC中使用动态链接库(2006-11-29 12:56:00)

摘要:使用动态链接库: 1、选择菜单“文件”——“新建”——“工程”——“MFC AppWizard[exe] ”建立一个单窗口程序(命名为“usedll”)
2、为CMyView添加OnLButtonDown处理,添加以下代码:
void CUsedllView::OnLButtonDown(UINT nFlags, CPoint point)
{
 CClientDC dc(this); 
 typedef void(*Ellipse)(CClientDC *pDC,int,int,int,int);
 typedef void(*Rectangle)(CClientDC *pDC,int,int,int,int);
 Ellipse pEllipse;
 Rectangle pRectangle;
 HINSTANCE hInstance=LoadLibrary("D:\\c++\\mydll\\Debug\\mydll.dll");
 PROC fn1=GetProcAddress(hInstance,"DrawEllipse");
 PROC fn2=GetProcAddress(hInstance,"DrawRectangle");
 pEllipse=(Ellipse)fn1;
 pRectangle=(Rectangle)fn2;
 (*pEllipse)(&dc,10,10,100,100);
 (*pRectangle)(&dc,100,100,150,150);
 
 CView::OnLButtonDown(nFlags, point);
}
3、编译运行。......

阅读全文(4549) | 评论:0

笔记:用VC++的MFC设计动态链接库(2006-11-29 12:49:00)

摘要:设计动态链接库: 1、选择菜单“文件”——“新建”——“工程”——“MFC AppWizard[dll] ”(命名为“mydll”)
2、在mydll.h中添加函数声明:
void DrawEllipse(CClientDC *pDC,int x1,int y1,int x2,int y2);
void DrawRectangle(CClientDC *pDC,int x1,int y1,int x2,int y2);
3、在mydll.cpp中最后添加函数定义:
void DrawEllipse(CClientDC *pDC,int x1,int y1,int x2,int y2)
{
 pDC->Ellipse(x1,y1,x2,y2);
} void DrawRectangle(CClientDC *pDC,int x1,int y1,int x2,int y2)
{
 pDC->Rectangle(x1,y1,x2,y2);
}
4、在mydll.def中最后添加声明:
DrawEllipse
DrawRectangle
5、编译——构建“mydll.dll”......

阅读全文(3673) | 评论:0

笔记:在MFC中怎样添加一个非模态的对话框(2006-11-29 11:02:00)

摘要:添加一个非模态对话框
1、点击菜单 插入——资源,选择Dialog,点击新建。
2、编辑对话框,添加一些控件什么的。
3、双击对话框或者打开ClassWizard,为对话框建立一个类,如CMyDialog。
4、在*view.cpp的开头添加新建立的类的头文件(如:#include "mydialog.h")。这点很重要,漏了这步编译的时候经常提示出错的。
5、在主窗口的view类定义中添加一个对话框的指针定义,如:
class CTest3View : public CView
{
......
public:
 CMyDialog* pMydialog;
......
}
6、为主窗口增加一个按钮或者菜单,准备点击后弹出对话框,用ClassWizard指定执行函数(如OnOption)。内容如下:
void CTest3View::OnOption()
{
pMydialog=new CMyDialog;//建立对话框
pMydialog->m_width=width;//向对话框输出数据(根据实际情况定)
pMydialog->Create(CMyDialog::IDD);
pMydialog->ShowWindow(SW_SHOW); //显示对话框
}
7、运行一下,对话框就出现了。
8、为了让对话框的数据能反馈回主窗口,需要通过对话框向主窗口发送一个自定义消息,触发主窗口的一个函数,把对话框的数据传回主窗。为了能向主窗口发送消息,需要取得主窗口指针,因此重载对话框的构造函数,生产对话框的时候把主窗的指针传给对话框。
9、在CMyDialog.h增加以下:
#define WM_DIALOGOK WM_USER+1  //自定义点击OK按钮的消息宏
#define WM_DIALOGAPPLY WM_USER+2 //自定义点击APPLY按钮的消息宏
class CMyDialog : public CDialog
{
...
public:
 CMyDialog(CView* pParent);&......

阅读全文(6430) | 评论:2

笔记:在VC++的MFC中为对话框添加各类型控件(2)(2006-11-28 16:39:00)

摘要:
G、增加列表框
1、在对话框中添加1个列表框(ListBox)。
2、打开ClassWizard,为列表框(IDC_LIST1)添加一个对应的参数(CString):m_list1_string,和一个对应的控件(CListBox):m_list1。
3、在对话框的数据交换函数(CMyDialog::DoDataExchange)中,添加以下代码:
 m_list1.AddString("红色");//添加列表框的项目
 m_list1.AddString("绿色");
 m_list1.AddString("蓝色");
 //为了让列表项目能自动选择项目,以上代码应添加在数据交换“DDX_LBString(pDX, IDC_LIST1, m_list1_String);”之前
4、调用对话框函数如:
void CTest3View::OnOption()
{
 CMyDialog mydialog;
 mydialog.m_list1_String="红色";//与对话框进行数据交换
 if(mydialog.DoModal()==IDOK)//模式对话框调用
 {
  colorstring=mydialog.m_list1_String;//从对话框获得数据
 };
 IfInvalidate(); 
} H、增加组合框
1、在对话框中添加1个组合框(combobox)。
2、打开ClassWizard,为组合框(IDC_COMBO1)添加一个对应的参数(CString):m_combo_string。
3、打开组合框的属性,在DATA页面添加列表项目。......

阅读全文(5025) | 评论:0

笔记:在VC++的MFC中为对话框添加各类型控件(1)(2006-11-21 11:40:00)

摘要:入门学习笔记: A、增加新对话框(模态):
1、点击菜单插入-资源,选择Dialog,点击新建。
2、编辑一下对话框。
3、资源做完了,准备连接上一个类,点击菜单查看-建立类向导(ClassWizard)。
4、点击AddClass新建一个类。
5、如无意外刚才新添加的资源(包括资源的ID号)已经出现在新建类对话框中,只需要添加一个类名(如CMyDialog),点击确定,新的类便产生,并与资源连接上。
6、在*view.cpp的开头添加新建立的类的头文件(如:#include "mydialog.h")。
7、在执行函数里面添加打开对话框的指令:
 CMyDialog mydialog;//建立实例
 mydialog.DoModal();//实例执行 
8、运行一下。 B、增加微调控件:
1、在对话框的已有文本框旁边添加一个spin。
2、在spin属性的STYLE中选Setbuddyinteger。
3、打开ClassWizard,为文本框添加一个对应m_edit1控件和一个整数m_abc。
4、为spin添加一个对应m_spinbtn1控件。
5、在CMyDialog::OnInitDialog() 中添加以下代码:
 m_abc=10;
 m_spinbtn1.SetBuddy(&m_edit1);//设置关联的控件
 m_spinbtn1.SetRange(0,255);//设置可以微调范围
 m_spinbtn1.SetPos(m_abc);//设置初始值
8、运行一下。 C、增加滑动条:
1、在对话框中添加一个滑动条(slider)。
2、在slider的属性的STYLE中选择滑动条是竖向还是横向。
3、打开ClassWizard,为滑动条添加一个对应的m_slider1控件和一个整数m_slider1_value。
4、在CMyDialog::OnInitDialog() 中添加以下代码:
 m_slider1.SetRange(0,255);//设置数值范围
 m_slider1_value=......

阅读全文(13933) | 评论:2

学习VC++的视频教程(2006-10-30 15:26:00)

摘要:在PCONLINE上找到一个《视频教程:VC++从入门到精通》,比自己一个人看闷书舒服很多啊。 http://www.pconline.com.cn/pcedu/empolder/gj/vc/0607/820674.html......

阅读全文(2146) | 评论:0