Embedded Visual C++ 4.0开发技巧(1)

 2006-3-3

做eVC++这么些天,总算入门了,其中绕了很多弯路,费了很多时间。在此记录下eVC++编程入门的过程中容易卡住的地方,希望后来人有所借鉴。  

 

l         我习惯了VB那样的Form编程,无法适应MFC怎么办?

一个小的程序一般不必利用MFC的文档/视图结构,那样实在是很麻烦。其实MFC编程也可以基于对话框的。VC++里面的对话框资源设计器是VB程序员最熟悉的东西了,你可以任意拖一些控件到对话框面板上,然后按回车键就可以编辑它的属性,双击一个按钮就可以创建一个事件响应,再次双击就可以编写响应的代码,这倒是挺爽的。对,编写小应用程序就不妨使用基于对话框的MFC.把对话框理解为Form就行了。接下来找一些不同之处:

n         文本和图片拖进去就统统成了IDC_STATIC,无法创建响应事件。不要急,把IDC_STATIC改成别的就行了,比如ID_PIC,然后用ClassWizard赋予它控制变量,再双击看看:)。然后你就可以在程序里任意改变它的属性,比如SetWindowText(),SetBitmap()等等。

n         控件放多了总是互相遮盖,设计器没有做好层次的管理问题,所以调来调去效果总是不尽人意。其实这是因为设计器总是把先放在面板上的控件排在最高层,后方上去的排在最底层,和通常使用习惯相反。按照这个思路可以做一些创建先后顺序的调整。也用记事本可以打开资源文件(xxxx.RC),手工调整控件的排列层次顺序。

l         怎样在任意函数内在屏幕上画图?

在屏幕上画图需要获取CDC指针。在文档/视图结构程序中,视图类里有OnDraw函数,由系统传递了CDC* pDC参数,所以可以直接用。在其他函数内想要在屏幕上画图就需要获取CDC指针。代码如下:

 

CDC* pDC=GetDC();

 

也可以不声明指针,直接在需要的地方使用GetDC(),如:

 

GetDC()->SetTextColor(RGB(0,0,0));

l         只有CDC指针时,怎样获取HDC结构指针?

比如使用函数

TransparentImage(pDC,left, top, bmpInfo.bmWidth, bmpInfo.bmHeight, dcMemory, 0,0,bmpInfo.bmWidth, bmpInfo.bmHeight, crTransparent);

编译会出现这样的错误:

Error C2664: 'TransparentImage' : cannot convert parameter 1 from 'class CDC *' to 'struct HDC__ *'

只需要把参数pDC改为pDC->m_hDC即可。

l         怎样在客户区创建位图按钮?

MSDN里只讲了这些:

To create a bitmap-button control in a window’s client area

Create one to four bitmap images for the button.

Construct the CBitmapButton object.

Call the Create function to create the Windows button control and attach it to the CBitmapButton object.

Call the LoadBitmaps method to load the bitmap resources after the bitmap button is constructed.

还给出了例子,如下:

CBitmapButton myButton;

// Create the bitmap button (must include the BS_OWNERDRAW style).

myButton.Create(NULL, WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,

  CRect(10,10,100,100), pParentWnd, 1);

// Load the bitmaps for this button.

myButton.LoadBitmaps(IDB_UP, IDB_DOWN, IDB_FOCUS, IDB_DISABLE);

用ClassWizard建立View的Create事件,把它放进去就行了。

接下来需要编制该按钮的响应事件,在.h文件的DECLARE_MESSAGE_MAP() 前面加上相应函数的声明,例如:

afx_msg void OnBtnMenu();

在.cpp文件中BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间加入ON_BN_CLICKED(IDC_BTN_MENU, OnBtnMenu)

其中IDC_BTN_MENU是按钮的ID,因为是自己创建的,需要在资源中加入它得字符串ID,系统会自动分配一个数字给它,这个数字我们不必关心,只要知道IDC_BTN_MENU就代表这个按钮就行了;OnBtnMenu是响应事件的函数名,在后面添加这个函数就行了,当然也不要忘了声明这个函数。

创建普通按钮同理,其实更加简单。不过千万不要使用BS_OWNERDRAW属性,否则系统不会自动画出它的。

l         怎样在对话框创建位图按钮?

上面讲了怎样在客户区创建位图按钮,可是我更喜欢用对话框,所以希望在对话框上放置位图按钮。

很简单,使用资源创建器来创建一个普通按钮,用ClassWizard赋予它控制变量,在头文件里把它的类型改为CBitmapButton,它就变成位图按钮了。然后把它的属性Owner Draw选上。接下来在OnInitDialog中使用LoadBitmaps函数就成功了,比如:

myButton.LoadBitmaps(IDB_UP, IDB_DOWN, IDB_FOCUS, IDB_DISABLE);

双击它也可以产生响应函数设置,和普通按钮一样使用。

l         怎样隐藏一个控件?

很简单,用ClassWizard赋予控件一个控制变量,注意,一定是CControl型的!然后调用它的ShowWindow(SW_HIDE)即可,想再显示出来就调用ShowWindow(SW_SHOW)。

你可能感兴趣的:(嵌入式)