文档库 最新最全的文档下载
当前位置:文档库 › VC对话框中显示图片及滚动条的使用

VC对话框中显示图片及滚动条的使用

VC对话框中显示图片及滚动条的使用
VC对话框中显示图片及滚动条的使用

VC对话框中显示图片及滚动条的使用

<对话框控件显示图片>

在VC对话框程序中,图片的显示载体一般需要使用对话框控件。在此总结下在控件上绘图的几点东西:

1、在对话框资源中放置图片控件,并对其类型属性选为Frame。可在对话框的绘图消息响应函数OnPaint或其他函数中,用CWnd类的函数GetDlgItem:CWnd* GetDlgItem( int nID ) const;来获得图片控件的窗口对象,再用函数GetDC:CDC* GetDC( );由窗口对象得到DC,然后就可以用该DC在控件中画图。

2、在对话框资源中放置非Frame类静态控件,先按顺序依次调用CWnd类的Invalidate和UpdateWindow函数后,再开始用DC画图。

注:

I、为了使在运行时能够不断及时更新控件的显示(主要是自己加的显式代码),可以将自己绘制控件的所有代码都全部加入对话框类的消息响应函数OnPaint中。在需要时(例如在绘图参数修改后),自己调用CWnd的Invalidate和 UpdateWindow函数,请求系统刷新对话框和控件的显示。因为控件也是窗口,控件类都是CWnd的派生类。所以在对话框和控件中,可以像在视图类中一样,调用各种CWnd的成员函数;

II、为了在鼠标指向控件时,避免控件自己绘制的图形消去,需要设置控件的“Owner Draw”属性为“True”;

III、如果希望非按钮控件(如图片控件和静态文本等),也可以响应鼠标消息(如单击、双击等),需要设置控件的“Notify”属性为“True”;

<使用对话框滚动条浏览控件上的图片>

当图片显示范围超过控件大小时,我们需要使用滚动图片以便浏览超出图片的其他部分。对话框滚动条控件包括水平滚动条和垂直滚动条,使用步骤:

1、像对话框添加两种控件资源,分别添加实例变量;

2、添加控件的响应消息函数CWnd::OnVScroll 和CWnd::OnHScroll,完成控件的滚动消息响应;

3、根据滚动位置更新图片的显示区域;

注:

---------------------------------------------------------------------------------------

CWnd::OnHScroll

afx_msg void OnHScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar );

Parameters

nSBCode

Specifies a scroll-bar code that indicates the user’s scrolling request. This parameter can be one of the following:

?SB_LEFT Scroll to far left.

?SB_ENDSCROLL End scroll.

?SB_LINELEFT Scroll left.

?SB_LINERIGHT Scroll right.

?SB_PAGELEFT Scroll one page left.

?SB_PAGERIGHT Scroll one page right.

?SB_RIGHT Scroll to far right.

?SB_THUMBPOSITION Scroll to absolute position. The current position is specified by the nPos parameter.

?SB_THUMBTRACK Drag scroll box to specified position. The current position is specified by the nPos parameter.

nPos

Specifies the scroll-box position if the scroll-bar code is SB_THUMBPOSITION or

SB_THUMBTRACK; otherwise, not used. Depending on the initial scroll range, nPos may be negative and should be cast to an int if necessary.

pScrollBar

If the scroll message came from a scroll-bar control, contains a pointer to the control. If the user clicked a window’s scroll bar, this parameter is NULL. The pointer may be temporary and should not be stored for later use.

Remarks

The framework calls this member function when the user clicks a window’s horizontal scroll bar.

The SB_THUMBTRACK scroll-bar code typically is used by applications that give some feedback while the scroll box is being dragged.

If an application scrolls the contents controlled by the scroll bar, it must also reset the position of the scroll box with the SetScrollPos member function.

Note This member function is called by the framework to allow your application to handle a Windows message. The parameters passed to your function reflect the parameters received by the framework when the message was received. If you call the base-class implementation of this function, that implementation will use the parameters originally passed with the message and not the parameters you supply to the function.

Example

void CMyView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

{

// Get the minimum and maximum scroll-bar positions.

int minpos;

int maxpos;

pScrollBar->GetScrollRange(&minpos, &maxpos);

maxpos = pScrollBar->GetScrollLimit();

// Get the current position of scroll box.

int curpos = pScrollBar->GetScrollPos();

// Determine the new position of scroll box.

switch (nSBCode)

{

case SB_LEFT: // Scroll to far left.

curpos = minpos;

break;

case SB_RIGHT: // Scroll to far right.

curpos = maxpos;

break;

case SB_ENDSCROLL: // End scroll.

break;

case SB_LINELEFT: // Scroll left.

if (curpos > minpos)

curpos--;

break;

case SB_LINERIGHT: // Scroll right.

if (curpos < maxpos)

curpos++;

break;

case SB_PAGELEFT: // Scroll one page left.

{

// Get the page size.

SCROLLINFO info;

pScrollBar->GetScrollInfo(&info, SIF_ALL);

if (curpos > minpos)

curpos = max(minpos, curpos - (int) info.nPage);

}

break;

case SB_PAGERIGHT: // Scroll one page right.

{

// Get the page size.

SCROLLINFO info;

pScrollBar->GetScrollInfo(&info, SIF_ALL);

if (curpos < maxpos)

curpos = min(maxpos, curpos + (int) info.nPage);

}

break;

case SB_THUMBPOSITION: // Scroll to absolute position. nPos is the position

curpos = nPos; // of the scroll box at the end of the drag operation. break;

case SB_THUMBTRACK: // Drag scroll box to specified position. nPos is the

curpos = nPos; // position that the scroll box has been dragged to. break;

}

// Set the new position of the thumb (scroll box).

pScrollBar->SetScrollPos(curpos);

CView::OnHScroll(nSBCode, nPos, pScrollBar);

}

----------------------------------------------------------------------------- CWnd::OnVScroll

afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar ); Parameters

nSBCode

Specifies a scroll-bar code that indicates the user’s scrolling request. This parameter can be one of the following:

?SB_BOTTOM Scroll to bottom.

?SB_ENDSCROLL End scroll.

?SB_LINEDOWN Scroll one line down.

?SB_LINEUP Scroll one line up.

?SB_PAGEDOWN Scroll one page down.

?SB_PAGEUP Scroll one page up.

?SB_THUMBPOSITION Scroll to the absolute position. The current position is provided in nPos.

?SB_THUMBTRACK Drag scroll box to specified position. The current position is provided in nPos.

?SB_TOP Scroll to top.

nPos

Contains the current scroll-box position if the scroll-bar code is SB_THUMBPOSITION or SB_THUMBTRACK; otherwise not used. Depending on the initial scroll range, nPos may be negative and should be cast to an int if necessary.

pScrollBar

If the scroll message came from a scroll-bar control, contains a pointer to the control. If the user clicked a window’s scroll bar, this parameter is NULL. The pointer may be temporary and should not be stored for later use.

Remarks

The framework calls this member function when the user clicks the window’s vertical scroll bar.

OnVScroll typically is used by applications that give some feedback while the scroll box is being dragged.

If OnVScroll scrolls the contents of the CWnd object, it must also reset the position of the scroll box with the SetScrollPos member function.

Note This member function is called by the framework to allow your application to handle a Windows message. The parameters passed to your function reflect the parameters received by the framework when the message was received. If you call the base-class implementation of this function, that implementation will use the parameters originally passed with the message and not the parameters you supply to the function.

<程序示例>

滚动消息响应:根据图片的显示大小设置滚动条的滚动步长信息

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 void CImageboxUI::OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )

{

SCROLLINFO vSI;

m_vScrollBar.GetScrollInfo(&vSI);

switch (nSBCode)

{

case SB_TOP:

vSI.nPos = 0;

break;

case SB_BOTTOM:

vSI.nPos = INT_MAX;

break;

case SB_LINEUP:

{

vSI.nPos -=

(int)((m_imageShow.Height()*m_dRatioY)/70);

vSI.nPos = vSI.nPos

vSI.nMin:vSI.nPos;

}

break;

case SB_LINEDOWN:

{

vSI.nPos +=

(int)((m_imageShow.Height()*m_dRatioY)/70);

vSI.nPos = vSI.nPos>vSI.nMax?

vSI.nMax:vSI.nPos;

}

break;

case SB_PAGEUP:

break;

case SB_PAGEDOWN:

break;

case SB_THUMBPOSITION:

break;

case SB_THUMBTRACK:

vSI.nPos = nPos;

break;

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

break;

}

m_vScrollBar.SetScrollInfo(&vSI); SendMessage(WM_PAINT);

CDialog::OnVScroll(nSBCode, nPos, pScrollBar);

}

void CImageboxUI::OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )

{

SCROLLINFO hSI;

m_hScrollBar.GetScrollInfo(&hSI);

switch (nSBCode)

{

case SB_LEFT:

hSI.nPos = 0;

break;

case SB_RIGHT:

hSI.nPos = INT_MAX;

break;

case SB_LINERIGHT:

{

hSI.nPos +=

(int)((m_imageShow.Width()*m_dRatioX)/70);

hSI.nPos = hSI.nPos

hSI.nMin:hSI.nPos;

}

break;

case SB_LINELEFT:

{

hSI.nPos -=

(int)((m_imageShow.Width()*m_dRatioX)/70);

hSI.nPos = hSI.nPos

hSI.nMin:hSI.nPos;

}

break;

case SB_PAGEUP:

break;

case SB_PAGEDOWN:

break;

case SB_THUMBPOSITION:

break;

hSI.nPos = nPos;

break;

case SB_ENDSCROLL:

break;

}

m_hScrollBar.SetScrollInfo(&hSI);

SendMessage(WM_PAINT);

CDialog::OnHScroll(nSBCode, nPos, pScrollBar);

}

1 根据滚动信息进行图片绘制(双缓冲机制):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2void CImageboxUI::OnPaint()

{

CPaintDC dc(this); // device context for painting

// TODO: 在此处添加消息处理程序代码

// 不为绘图消息调用 CDialog::OnPaint()

//////////////////////////////////////////////////////////////////////////

// 对话框Static 控件双缓冲绘图

CWnd* pImageWnd=GetDlgItem(IDC_STATIC_PIC);

if (NULL==pImageWnd) return;

pImageWnd->ModifyStyle(0, BS_OWNERDRAW); // 修改CStatic 样式,改成自绘制(图形不被消去)

// 绘图控件的DC

CDC* pDC=pImageWnd->GetDC();

if (NULL==pDC) return;

// 绘图背景区域大小

pImageWnd->GetWindowRect(&m_backShow);

ScreenToClient(&m_backShow);

// 图像绘制的实际大小

CRect imageShow;

imageShow.SetRect(0,0, (int)(m_imageShow.Width()*m_dRatioX), (int)(m_imageShow.Height()*m_dRatioY));

// 滚动条信息

SCROLLINFO vSI, hSI;

m_vScrollBar.GetScrollInfo(&vSI);

m_hScrollBar.GetScrollInfo(&hSI);

/// 绘图

1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4CDC memeroyDC;

CBitmap memeroyBP;

memeroyDC.CreateCompatibleDC(NULL);

memeroyBP.CreateCompatibleBitmap(pDC,m_backShow.Width(),m_b

ackShow.Height());

CBitmap *pOldBit=memeroyDC.SelectObject(&memeroyBP);

// 在内存上绘制绘图背景

CBrush backBrush;

backBrush.CreateSolidBrush(RGB(128,128,128));

CBrush* pOldBrush=memeroyDC.SelectObject(&backBrush);

memeroyDC.Rectangle(&m_backShow);

memeroyDC.SelectObject(pOldBrush);

backBrush.DeleteObject();

// 在内存上绘制实际大小图像

if (m_backShow.Width()

{

;

}

else

{

int y=0;

int

x=(int)((m_backShow.Width()-imageShow.Width())/2.0);

if (m_backShow.Height()>imageShow.Height())

{

y=(int)((m_backShow.Height()-imageShow.Heig ht())/2.0);

}

imageShow.OffsetRect(x,y);

}

imageShow.OffsetRect(-hSI.nPos,-vSI.nPos);

m_imageFile.StretchBlt(memeroyDC.m_hDC, imageShow, SRCCOPY);

// 将内存图像绘制到控件

pDC->BitBlt(0,0,m_backShow.Width(),m_backShow.Height(),&mem eroyDC,0,0,SRCCOPY);

// 释放对象和DC

memeroyBP.DeleteObject();

memeroyDC.SelectObject(pOldBit);

memeroyDC.DeleteDC();

3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 5 9 6 0 6 1 6 2 6 3 6 4 6ReleaseDC(pDC);

}

5

6

6

6

7

6

8

6

9

7

7

1

<程序效果>

VC 中自己创建对话框方法

VC中自己创建对话框的方法 这里讲在VC中不需要打开MFC工程,通过代码直接创建一个对话框,我看这个对话框比MFC的漂亮多了,而且要写会代码不需要研究MFC就直接开发新的工程. 先打开VC++ 6.0 版本, 第一步:创建一个工程名为:Main Dialog 的Win32 Application。创建过程如下: 打开File菜单中New,选自Win32 Application,工程名为:Main Dialog,点击OK,再选自A simple Win32 application。点击Finish,再点击OK.(见图1) 第二步:创建资源脚本。再打开File菜单中New,选自File选项的Resource Script(就是资源脚本),文件名为Dialog,点击OK。

(见图2) 第三步:插入对话框。刚才建立的脚本Dialog显示为Dialog.rc,就在Dialog.rc上面点击鼠标右键Insert(插入)Resource中选自插入Dialog(对话框),点击New(新建),这样对话框插入完毕。(见图3)

第四步:添加resource.h。我们把第四步插入的对话框ID改为IDD_MAIN ,在FileView中有个Header Files的文件,上面点击右键,选择Add Files to Folder...(添加文件到目录),弹出一个工程目录窗口,中间找到resource.h,然后OK了(添加)。(见图4)

第五步:复制代码。双击Main Dialog.cpp,我们写代码的位置出现了(见图5),那里有几行代码,把它们全部删掉,下面已经准备好的代码全部复制到那里,编译,执行,您的是否成功了? #include "stdafx.h" #include "resource.h" #include BOOL WINAPI Main_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam); BOOL Main_OnInitDialog(HWND hwnd,HWND hwndFocus,LPARAM lParam); void Main_OnCommand(HWND hwnd,int id,HWND hwndCtl,

VC对话框控件属性的修改

【作者按】本文主要针对初学者在使用对话框赋值时的一些问题而写。如果你对对话框的使用已经很熟练,请跳过本文。 【针对现象】许多初学者,常常写出这样的程序来修改对话框中某个按钮的标题: 其中m_Btn的定义为CButton m_Btn; 这段程序运行后会报错,debug一下,错误会指向一个断言语句 ASSERT(::IsWindow(m_hWnd));报告窗口指针为空。看一下m_hWnd,等于0x00000000.其实就是m_Btn这个CButton对象的句柄为空。 【原因分析】出现这种错误的原因,显然是m_Btn这个窗口对象还没有创建造成的。我们看一下CMyDialog dlg这个构造函数,看一看MSDN对CDialog构造函数的说明。其实它只是简单的创建了一个对话框实例。这里我这样理解,就是对话框是一个容器,而对话框上的各个控件是容器中包含的对象。对话框的构造函数只是构造了一个容器,而并没有创建容器中的各个对象。我想这里大家就应该明白为什么m_Btn的句柄为空了。 那对话框中的控件在什么时候被创建的呢?我个人没有仔细的研究过,但从个人使用的经验看,应该在DoModal函数和对话框的Create函数中创建的。因为使用一个模式对话框时,m_Btn.SetWindowText("MyButton")语句在OnInitDialog函数中执行没有问题。所以应该在DoModal中创建的。至于DoModal中是如何创建的,欢迎各位高手给与讲解。而对于非模式对话框,以下的程序运行没有问题: 可见控件的创建应该在Create函数中。

[解决办法]那么,如果非要实现这样的功能怎么办呢?笔者的解决办法是在对话框类中增加成员变量,比如m_sBtnTitle。数据的传递有以下三种方法: 1。增加Set函数,比如SetBtnTitle(CString str); 调用程序如下: 2。将m_sBtnTitle定义成公有类型。 那么dlg.m_sBtnTitle = "MyButton";就可以了。 3。修改或者重载一个新的构造函数,比如: 最后,在对话框类的初始化函数增加m_Btn.SetWindowText(m_sBtnTitle);即可。 还有一些网友提供的方法是定义全局变量。当然,首先肯定全局变量是可以完成此功能的。不过笔者并不赞同用全局变量的方法。对于面向对象的编程和设计来说,全局变量应该尽量少使用,因为全局变量将增加模块之间的耦合度,与面向对象的思想是有违背的。正如goto 语句,好用但尽量少用。在这里笔者并不是反对用全局变量,而是要看情况而用。笔者曾经开发过一个日本项目,粗略计算一下,全局变量不下于1000个,这样的程序的维护难度可想而知。 希望此文能够帮助初学者在VC之路上少走一些歪路,尽快融入VC开发大军。

VC++对话框添加工具栏

VC++对话框添加工具栏 1、添加工具栏资源ID为IDR_TOOLBAR 2、在对话框的类定义中加: CToolBar m_ToolBar; 3、在OnInitDialog中或其它合适的消息响应中加如下代码:(函数可查看MSDN) m_ToolBar.Create(this); //创建工具栏 m_ToolBar.LoadToolBar(IDR_TOOLBAR);//加载工具栏 //得出控件条大小. CRect rect; CRect rectNow; GetClientRect(rect); RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rect Now); //放置控件条位置 CPoint ptOffset(rectNow.left-rect.left,rectNow.top-rect.top); CRect rcChild; CWnd* pwndChild=GetWindow(GW_CHILD); while (pwndChild) { pwndChild->GetWindowRect(rcChild); ScreenToClient(rcChild); rcChild.OffsetRect(ptOffset); pwndChild->MoveWindow(rcChild,FALSE); pwndChild=pwndChild->GetNextWindow(); } //调整对话框尺寸 CRect rcWindow; GetWindowRect(rcWindow); rcWindow.right+=rect.Width()-rectNow.Width(); rcWindow.bottom+=rect.Height()-rectNow.Height(); MoveWindow(rcWindow, FALSE);

VC++实现对话框工程中添加菜单

VC++对话框程序中添加菜单 在VC中创建一个基于对话框的MFC程序,要在其中添加菜单总共分三步: 1、首先插入一个菜单资源IDR_MENU1,然后可以编辑修改菜单; 2、然后在为对话框添加一个CMenu类型的成员变量m_Menu; 3、在OnInitDialog()中添加如下的代码: m_Menu.LoadMenu(IDR_MENU1);//载入菜单 SetMenu(&m_Menu); //显示菜单 经过这三步以后菜单就可以显示出来了。 MFC 对话框工程中添加菜单(VC++ 6.0编译器) MFC 对话框工程中添加菜单(VC++ 6.0编译器) 第一步:创建对话框资源和菜单资源. 第二步:添加菜单到对话框中 方法一: 在创建的对话框中右键,在Menu选项选择自己的菜单ID如下图

此时就可以了. 方法二: 不用方法一,直接添加代码完成上述功能. 添加代码到DialogDlg ::OnInitDialog中 CMenu *menu = new CMenu; menu ->LoadMenu(MAKEINTRESOURCE(IDR_MENU)); //IDR_MENU 菜单ID this ->SetMenu(menu); 或者 Cmenu m_menu; m_menu.LoadMenu(IDR_MENU); SetMenu(&m_menu); 此时结果如下图 最后在添加菜单到对话框类中,实现其各种功能. 下面是在上面的基础上实现的通用对话框空间的功能代码,方便以后开发使用. (1)打开文件对话框 条件: OPENFILENAME结构体初始化 GetOpenFileName函数调用

VC中对话框使用技巧集合

注:以下代码以一个名为CTest6Dlg的对话框类为例 -------------------------------------------------------------------------------- 1. 在任务栏隐藏对话框 ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW); -------------------------------------------------------------------------------- 2. 使对话框为顶层窗口 SetWindowPos(&this->wndTopMost, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); -------------------------------------------------------------------------------- 3. 在运行时添加最大化,最小化按钮 SetWindowLong(this->m_hWnd, GWL_ST YLE, GetWindowLong(this->m_hWnd, GWL_ST YLE) | WS_MINIM IZEBOX | WS_MAXIMIZEBOX); UpdateWindow(); -------------------------------------------------------------------------------- 4. 使能对话框右上角关闭按钮 在OnInitDialog中 方法一: CMenu* menu = GetSystemMenu(FALSE); menu->Modify M enu(SC_CLOSE, MF_BYCOMMAND | M F_GRAYED ); 方法二: CMenu* menu = GetSystemMenu(FALSE); menu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND | MF_GRAYED); -------------------------------------------------------------------------------- 5. 当对话框一部分在屏幕外时,显示全部对话框 SendMessage(DM_REPOSITION); -------------------------------------------------------------------------------- 6. 改变鼠标外形 添加WM_SETCURSOR 消息映射函数 BOOL CTest6Dlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { SetCursor(AfxGetApp()->LoadStandardCursor(IDC_HELP)); return 0; } -------------------------------------------------------------------------------- 7. 改变对话框背景色和文本颜色 在CTest6App的InitInstance中添加

VC++对话框中使用表格控件的方法

在对话框中使用表格控件的方法: 将该控件改成“report”类型,方法如下。 首先打开该控件的属性,将其设置为“Report”类型,如下图所示。

改完后变为如下形式,是变成了一个列表框。 下面说一下如何通过代码向控件中填加内容,主要是设置表头,然后加入内容,至少有两种方法可以进行信息的加入,下面仅介绍一种。 首先向与对话框对应的类中加入一个与ListControl控件对应的成员函数。填加方法如下:

运行“ClassWizard”定义一个类的ListCtrl控件成员,填加界面如下,其中IDC_LIST1是上面填加的表格控件的ID 。 选中“Member Variables”标签,点击“Add Variable”出现如下对话框,添加变量名,添加后,就会在与对话框对应的类中加如m_List变量,类型为CListCtrl。

在程序中加入如下代码,实现在表格中显示信息: m_List.InsertColumn(0,"Col 1",LVCFMT_LEFT,80,0); //设置列 m_List.InsertColumn(1,"Col 2",LVCFMT_LEFT,80,1); m_List.InsertColumn(2,"Col 3",LVCFMT_LEFT,80,2); m_List.InsertItem(0,"Item 1_1"); //插入行 m_List.SetItemText(0,1,"Item 1_2"); //设置该行的不同列的显示字符m_List.SetItemText(0,2,"Item 1_3"); 运行上面几行代码后的效果如下图所示。

VC 对话框自带滚动条的使用

VC对话框自带滚动条的使用 一,使用对话框窗口自带的滚动条,在属性页面中设置即可,如下 二,OnInitDialog()函数中,添加如下滚动条初始化语句 SCROLLINFO vinfo; vinfo.cbSize =sizeof(vinfo); vinfo.fMask =SIF_ALL; vinfo.nPage =50;//滚动块自身的长短,通常有如下关系:其长度/滚动条长度(含两个箭头)=nPage/(nMax+2),//另外nPage取值-1时,滚动条会不见了。 vinfo.nMax =600;//滚动条所能滚动的最大值 vinfo.nMin=0;//滚动条所能滚动的最小值 vinfo.nTrackPos =0; SetScrollInfo(SB_VERT,&vinfo);//即使上述步骤一不做,使用此条语句也可以显示滚动条 三,添加相应的WM_VSCROLL函数

void CMy1d0Dlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default SCROLLINFO scrollinfo; GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); switch (nSBCode) { case SB_BOTTOM: //滑块滚动到最底部 ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMax)*10); //滚动屏幕 scrollinfo.nPos = scrollinfo.nMax; //设定滑块新位置 SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); //更新滑块位置 break; case SB_TOP: //滑块滚动到最顶部 ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMin)*10); scrollinfo.nPos = scrollinfo.nMin; SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); break; case SB_LINEUP: //单击上箭头 scrollinfo.nPos -= 1; if (scrollinfo.nPosscrollinfo.nMax) { scrollinfo.nPos = scrollinfo.nMax; break; } SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); ScrollWindow(0,-10); break; case SB_PAGEUP: //单击滑块上方空白区域 scrollinfo.nPos -= 5; if (scrollinfo.nPos

VC改变对话框按钮字体颜色和背景的解决方案

要想修改CButton类按钮背景颜色和文字颜色,必须利用自绘方法对按钮进行重新绘制。这可以通过定义一个以CButton为基类的新按钮类来实现。以下为具体的实现方法: 方法一: 加入一个新类,类名:CMyButton,基类:CButton。 在头文件MyButton.h 中加入以下变量和函数定义: private: int m_Style; //按钮形状(0-正常,1-当前,2-按下,3-锁定) BOOL b_InRect; //鼠标进入标志 CString m_strText; //按钮文字 COLORREF m_ForeColor; //文本颜色 COLORREF m_BackColor; //背景色 COLORREF m_LockForeColor; //锁定按钮的文字颜色 CRect m_ButRect; //按钮尺寸 CFont* p_Font; //字体 void DrawButton(CDC *pDC); //画正常的按钮 // 接口函数 public: void SetText(CString str); void SetForeColor(COLORREF color); //设置文本颜色 void SetBkColor(COLORREF color); //设置背景颜色 void SetTextFont(int FontHight,LPCTSTR FontName); //设置字体 在MyButton.cpp 的构造函数中初始化变量: CMyButton::CMyButton() { m_Style = 0; //按钮形状风格 b_InRect = false; //鼠标进入标志 m_strText = _T(""); //按钮文字(使用默认文字) m_ForeColor = RGB(0,0,0); //文字颜色(黑色) m_BackColor = RGB(243,243,243); //背景色(灰白色) m_LockForeColor = GetSysColor(COLOR_GRAYTEXT); //锁定按钮的文字颜色p_Font = NULL; //字体指针 } 用ClassWizard添加下列消息函数: PreSubclassWindow(); DrawItem(); onMouse Move(); OnLButtonDown(); OnLButtonUp(); 在各函数内加入代码: void CMyButton::PreSubclassWindow() { ModifyStyle( 0, BS_OWNERDRAW ); //设置按钮属性为自画式 CButton::PreSubclassWindow();

VC设置对话框背景

VC设置对话框背景 少将2014-11-20 VC对话框默认的灰度背景实在是不美观,填充背景图成了改善用户界面的一个很好的选择。 首先在资源视图中添加一个位图资源,如命名为IDB_BMPBK。 在对话框中添加OnEraseBkgnd()事件处理函数,用于擦除背景进行重绘。其中添加的代码如下: BOOL DialogClass::OnEraseBkgnd(CDC* pDC) { //创建内存DC CDC MemDC; //CBitmap对象 CBitmap Bitmap,*pOldBitmap; //BITMAP句柄 BITMAP bm; //加载位图 Bitmap.LoadBitmap(IDB_BMPBK); //将位图资源与句柄绑定 Bitmap.GetObject(sizeof(BITMAP),&bm); //创建与内存兼容的DC MemDC.CreateCompatibleDC(pDC); //替换原位图 pOldBitmap=(CBitmap*)(MemDC.SelectObject(&Bitmap)); //获取绘制的区域 CRect rcClient; GetClientRect(&rcClient); //绘制到客户区 pDC->BitBlt(0,0,rcClient.Width(),rcClient.Height(),&MemDC,0,0,SRCCOPY); MemDC.SelectObject(pOldBitmap); MemDC.DeleteDC(); return TRUE; } 默认生成的OnEraseBkgnd()处理函数会有调用基类的处理函数然后再返回结果,要注意把这一句直接删除,然后直接返 TRUE。

VC++自定义控件的建立及使用方法

VC++自定义控件的建立及使用方法 本文来自: https://www.wendangku.net/doc/8f15008920.html, 详细来源请参考:https://www.wendangku.net/doc/8f15008920.html,/techntxt/201298191132524755545 VC++自定义控件的建立及使用方法来源:https://www.wendangku.net/doc/8f15008920.html,/ 发布日期:2012-09-08 点击次数:168 发布者IP:218.25.20.78 VC++自定义控件的使用方法 一、VC++定义自定义控件与delphi,VB有些差异。delphi,vb在file-new-other中建立。vc++在工具栏中就有 自定义控件,但必须加入控件类型。许多书籍都在类向导中建立。我这里介绍的是手动建立,其结果是一样的 。 二.建立过自定义控件类型: 2.1、把工具栏上的自定义控件放入对话框中 2.2、建立Mycontrol.h, Mycontrol.cpp文件 2.3、Mycontrol.h中的定义是 #ifndef __MYCTROLTRL_H__ #define __MYCTROLTRL_H__ #define MYWNDCLASS "mycontrol" #include class CMycontrol: public CWnd { private: public: static BOOL RegisterWndClass(); CMycontrol(); void customfun();//一个自定义方法 }; #endif 2.4 Mycontrol.cpp中的实现部分 #include "StdAfx.h" #include "mycontrol.h" CMycontrol::CMycontrol() { CMycontrol::RegisterWndClass(); } //注册控件RegisterWndClass格式是固定的不要记忆没有那个必要直接拷贝粘贴就可以。 CMycontrol::RegisterWndClass() {

从零开始学VC系列教程 二.对话框及常用控件实验

从零开始学VC系列教程二. 对话框及常用控件实验 恭喜你,进入VC学习的第二节了.这一节是人机交互的基础.所谓人机交互,说通俗点就是与机器对话.然而我们现在的技术还不能像科幻片里一样与机器人直接说话就行了.所以,我们的操作意图还得通过文本输入,命令按钮等等来实现. 本节内容:学会对话框调用及一些常用控件的使用方法. 学习目的:学习人机交互,为软件开发提供界面基础. 1.新建工程.参考第一节的方法新建一个工程,名字为Eg02完成后如下图 细心的朋友一定会发现.新建的工程里还有一个对话框,ID名是IDD_ABOUTBOX这个是做什么用的呢?我们用到的软件都会有一个版权声明.通过第一章的学习,大家应该知道怎么观看这个IDD_ABOUTBOX对话框了吧.没错!双击IDD_ABOUTBOX就可以了.我们会看到如下的一个对话框 这就是我们这个程序的关于对话框,一般用于版权声明及版本号标识.大家看到的这个对话框里有两个静态文本框和一个图像框(Picture),静态文本框我们在前一节已经介绍过了.大家可以修改一下版权所有这一行,填什么都可以,签个大名也行.完成以后你一定想看看效果,这个对话框怎么打开呢?其实VC已经为我们做好了.先按F7编译,然后按F5运行.大家可以看到

程序运行了. 单击应用程序图标,就会出现一个菜单,选最后一个[关于Eg02],关于对话框就弹出来了. 当然,这是系统为我们做好的.自己怎么在程序中调用这个对话框呢?为了演示,首先参考第一节的内容添加一个按钮,然后把按钮的ID改为IDC_BTN_ABOUTME,把标题,也就是Caption 改为[关于].最终效果如下 下面我们为按钮添加代码.相信大家一定还记得怎么进入代码吧..对了,双击[关于]按钮,在弹出的对话框中点[确定]就可以了.为了让大家更好的理解下面的操作,我们先要解释一下关于对话框的类.VC向导会为关于对话框建立一个类,大家看看下面的图

VC环境下在对话框中动态生成视图的方法

VC环境下在对话框中动态生成视图的方法 吴超 摘要阐述利用VC++进行软件开发中,如何在对话框中动态生成自定义视图的一种方法,并给出了具体实现步骤和代码。关键词动态生成视图 The method of creating dynamical view in dialog under VC environment Wu Chao Abstract Illustrating one method of creating custom dynamical view in dialog during VC++ software development work, and giving concrete steps and codes. Abstract Dynamic create View 0引言 在VC++开发的C/S软件中,对话框是Windows应用程序中最重要的用户界面元素之一。对话框中,数据一般只能显示在编辑框、列表框或树形控件等自带控件中,如需在对话框中将众多数据用自绘的曲线图或柱形图来显示,特别是通过对话框控件来控制和管理视图,以达到对数据有效处理和显示目的,就必须通过在对话框中动态生成自定义视图来实现。本文介绍了一种在对话框中增加视图的有效方法,通过了相关测试并给出应用实例。 1实现技术方法 对话框(Dialog) 实际上是一个窗口, 在MFC中对话框的 功能被封装在 CDialog类中,是 CWnd类的派生类, 而CView或其子类 CScrollView也派生 自CWnd类,如图1。 因此,在对话框中添 加视图,不能通过类 的继承或派生来简单实现,需要手工添加相关代码,涉及到下列技术方法,具体有四个步骤。 1.1添加CMyAddView 1.1.1 添加新类 Insert一个视图类CMyAddView,使其从CScrollView派生,当视图设置范围超过窗口大小时,会自动生成滚动条。 1.1.2 定义资源和变量 在视图类定义中加入视图资源定义“enum { IDD = IDD_SCROLL_VIEW};”和被使用的对话框指针“CMyAddViewDlg *pViewDlg;”语句。 在MyAddView.h 文件中引用“class CMyAddViewDlg;”,并在Resource.h文件中,添加资源定义代码“#define IDD_SCROLL_VIEW 107”,并将OnInitialUpdate函数变为公有函数。 1.1.3 为pViewDlg赋值 在CMyAddView的OnInitialUpdate函数中,为视图的父对话框指针赋值,增加“pViewDlg = (CMyAddViewDlg *) GetParentOwner();”。 1.2在对话框中加入指针变量 1.2.1 增加视图指针变量 在CMyAddViewDlg对话框中添加指向视图的指针变量“CMyAddView* m_pWnd;”。 1.2.2 添加AddView函数 BOOL CMyAddViewDlg::AddView(LPCTSTR lpszLabel, CRuntimeClass *pViewClass) { TRY { m_pWnd = (CMyAddView *)pViewClass->CreateObject(); if (m_pWnd == NULL) { AfxThrowMemoryException(); } } CATCH_ALL(e) { return FALSE; } END_CATCH_ALL DWORD dwStyle = AFX_WS_DEFAULT_VIEW; // 以下代码定义视图在对话框中的位置,数值以改变视图边框在对话框中的相对位置 CRect rect; 图1 类的继承关系

如何在VC++中两个对话框相互传递信息

如何在VC++中两个对话框相互传递信息 (2010-12-11 17:40:12) 在VC++中,打开对话框一般是用DoModal()函数调用模态对话框,但是模态对话框只能在对弹出的当前子窗口进行操作,而不能对父窗口进行操作,也无法传递数据到父窗口中,根据笔者的研究发现,采用非模态对话框的模式可以很好的解决这一问题。 在VS2008中新建一个就有MFC应用程序的Project项目,在弹出的MFC 应用程序向导中选择“基于对话框”,取消“使用Unicode库”,单击完成。在“资源视图”里面添加一个对话框,默认ID为IDD_DIALOG1。 双击IDD_DIALOG1对话框,在弹出的MFC类向导中,类名填写CSonDialog,基类选择CDialog,单击完成。这样我们就将新建的IDD_DIALOG1关联上一个基于CDialog的类了。 在父窗口上添加一个按钮,双击,便可进入这个按钮的消息响应函数。在最上面包含CSonDialog的头文件#include “SonDialog.h”。如果在消息响应函数中写入如下代码: CSonDialog SonWnd; SonWnd.DoModal(); 运行之后按下父窗口上的按钮,可以发现弹出了IDD_DIALOG1,但是只能在IDD_DIALOG1上操作,无法操作父窗口。如果想要在弹出子窗口后还可以操作父窗口的话,需要采用非模态对话框的模式弹出子窗口。 MFC在CDialog类中有一个Create(UINT nIDTemplate, CWnd *pParentWnd = 0),这个函数可以创建一个Dialog,其中参数nIDTemplate为需要创建的Dialog 的ID。同时还有一个函数ShowWindow(int nCmdShow),用来显示创建的这个Dialog。在消息响应函数中写入如下代码: CSonDialog SonWnd; SonWnd.Create(IDD_DIALOG1); SonWnd.ShowWindow(SW_SHOW); 运行之后按下父窗口上的按钮发现窗口闪了一下,然后就消失了。这是因为对象SonWnd是一个局部对象,在运行完SonWnd.ShowWindow(SW_SHOW)这条语句之后便退出了消息响应函数,因此SonWnd对象也就被销毁了。如果想要退出消息响应函数之后窗口依然存在,则需要将SonWnd定义为一个全局变量。因此在ProjectDlg.h中添加一个CSonDialog SonWnd的定义,同时由于VC++在

Visual C++(VC)中“选择文件夹”对话框的程序的编写

Visual C++(VC)中“选择文件夹”对话框的程序的编写 2010-04-1001:07A.M. 在实际的MFC编程当中,常常需要弹出对话框选择文件、选择目录等操作,对于选择文件,用CFileDialog就可以很简单的解决,而对于选择目录,则稍稍需要多一些步骤,需要自己创建Dialog。首先创建如下的对话框,并为它创建类Dialog,在Dialog头文件中添加保存目录名的变量CString m_strPath,然后为编辑框右边的按钮添加消息响应函数OnButtonBrowser(),并添加如下代码。 void CDialog::OnButtonBrowser() { //TODO:Add your control notification handler code here UpdateData(TRUE); char szDir[MAX_PATH]; BROWSEINFO bi; ITEMIDLIST*pidl; bi.hwndOwner=this->m_hWnd;//指定父窗口,在对话框显示期间,父窗口将被禁用 bi.pidlRoot=NULL;//如果指定NULL,就以“桌面”为根 bi.pszDisplayName=szDir; bi.lpszTitle="请选择目录";//这一行将显示在对话框的顶端 bi.ulFlags=BIF_STATUSTEXT|BIF_USENEWUI|BIF_RETURNONLYFSDIRS; bi.lpfn=NULL; bi.lParam=0; bi.iImage=0; pidl=SHBrowseForFolder(&bi); if(pidl==NULL)return; if(!SHGetPathFromIDList(pidl,szDir))return; else m_strPath=szDir; UpdateData(FALSE); } 当程序启动起来的时候,点击按钮,就会弹出如下的选择目录的对话框

VC-6.0-下MFC基于对话框-绘制图形

VC-6.0-下MFC基于对话框-绘制图形

附录表 一、具体步骤: 1、选择菜单栏的“新建”,选择MFC项目名为DrawGraphics,并设置为基于对话框的项目,如图-1、图-2所示; 图-1

图-2 2、按下键盘上的Ctrl+W键,调出类向导,选择“Add Class”,并点击“New”添加一个颜色按钮类CColorButton,继承自CButton类,如图-3所示:

图-3 3、在CColorButton中添加如下成员变量: COLORREF color; //按钮颜色 CPoint arrays[4]; //按钮顶点坐标 BOOL IsShow; //是 否显示按钮 BOOL IsPressed; //按 钮是否被按下

4、右击CColorButton类,选择Add Virtul function ,重写其DraItem函数,如图-4,图-5所示: 图-4 图-5

5、为其Drawitem函数中添加如下代码: CRect rect; GetClientRect(rect); CDC dc; dc.Attach(lpDrawItemStruct->hDC); arrays[0]=CPoint(rect.left,rect.top); arrays[1]=CPoint(rect.right,rect.top); arrays[2]=CPoint(rect.right,rect.bottom); arrays[3]=CPoint(rect.left,rect.bottom); //设置背景透明 dc.SetBkMode(TRANSPARENT); if (IsShow) { //创建一个位图画刷 CBrush brush(color); dc.SelectObject(&brush); CPen pen(PS_NULL,1,color); dc.SelectObject(&pen);

vc++对话框制作与编程-Dialog

实验项目三:文档视图结构 实验学时:6 实验类型:设计性 实验目的: 1.理解文档-视图结构 2.掌握SDI程序结构和开发 3.理解MDI程序结构和开发 4.设计支持多文档多视图结构的应用程序 实验内容与说明 第一部分:对话框制作与编程 本例将设计一个能够应用对话框进行参数选择、并运用这些参数进行窗口绘图的MFC程序。请通过此例掌握对话框资源的制作以及模态对话框的编程。同时理解文档视图结构。 第一步:新建工程 新建一个MFC AppWizard(exe)类型的工程,工程取名为DlgDemo。注意路径可能与本地磁盘不同。

修改应用程序类型为Single document。 保持其它设置不变,点击Finish按钮(包括随后的OK按钮)结束工程的创建。 第二步:窗口绘图 为简单起见,本例只打算在视图窗口内绘制一个矩形,该矩形的长度、宽度以及它们的单位都通过对话框进行选择。这些关于图形的关键数据一般应该保存在文档类中,视图类在需要绘图时,就从文档类中读取这些数据,这是文档视图结构的基本运行方式。 为此,需要向文档类CDlgDemoDoc中添加数据成员。在工程的类视图ClassView中右键单击文档类CDlgDemoDoc,选择Add Member Variable...,弹出添加数据成员的对话框。

在下列对话框中添加数据成员m_nWidth。 继续上述步骤,添加数据成员m_nHeight。 继续上述步骤,添加数据成员m_nUnit。 为提供对上述三个protected数据成员的访问,在文档类中提供public访问函数。在工程的类视图ClassView中右键单击文档类CDlgDemoDoc,选择Add Member Function...,弹出添加成员函数的对话框。

VC++6 第六章_创建和使用对话框

第6章创建和使用对话框 对话框是一种用户界面,几乎每一个Windows程序都使用对话框与用户进行交互。对话框可能是一个简单的只含有OK按钮的消息框,也可以是一个复杂的数据输入表单。对话框上有一些方便用户输入的控件,对话框依靠这些控件与用户进行交互,其实质是一个接收消息的窗口。 在本章节我们主要讲述模式对话框和无模式对话框的原理和使用方法,下一章将详细介绍各种控件的使用。你将学习创建一个对话框,使用对话框模板编辑一个对话框资源,并在程序中调用对话框的方法。 6.1 对话框的基本原理 6.1.1 对话框的工作原理 在创建一个对话框之前,我们先来了解一下对话框是如何工作的,对话框的数据来自三方面:对话框资源、对话框对象、和一个文档对象: 1.对话框资源 对话框资源是一个用户输入或取得数据的图形界面。这个图形界面是使用Develop Studio的对话框编辑器在对话框模板上创建的,程序员可以在对话框模板上增加并编辑控件,生成对话框资源。当应用程序运行时,就可以得到一个对话框。 2.对话框对象 MFC使用CDialog类来描述对话框,它是CWnd类的派生类。在CWnd类的基础上增加了数据交换的功能。当创建一个新的对话框资源后,使用ClassWizard可以创建一个对话框类的派生类。对话框对象实现了对话框和应用程序之间的通信。在应用程序中定义一个对话框对象后,在对话框显示前,可以通过访问对话框对象的成员变量为一个对话框的控件初始化,在对话框关闭后,可以通过访问对话框对象的成员变量获得用户的输入数据。 3.文档对象 MFC使用文档对象描述应用程序处理的数据,用户输入的数据要进一步的处理,通常要先存贮到文档对象中。例如:一个学生记录处理的应用程序,用户通过一个对话框输入学生记录并贮存到一个文件中。应用程序的处理顺序是:用户在对话框中输入信息,通过对话框对象得到输入信息,将输入信息整理到文档对象中,使用序列化函数将文档对象存贮到一个文件中,所以文档对象扮演了一个很重要的数据交换的角色。 MFC使用以上三者实现用户与应用程序之间数据交换,数据交换流程见图6-1所示,遵循四个步骤。

VC++6.0 MFC基于对话框简单计算器设计

VC++MFC基于对话框简单计算器设计1 实现计算器功能如图: 用VC++建立MFC基于对话框的简单计算器。 简易计算器设计说明: 1.三个编辑窗口: (1)其中两个为输入操作窗口:数1、数2,一个结果输出窗口。 (2)只有一个操作数时在第一操作窗口输入。 (3)键盘输入数据,运算符按钮输出结果。 2.多个运算操作按钮: (1)实现加减乘除的基本计算器功能。 (2)实现三角函数、对数、阶乘等的数值函数运算。 3.计算器设计过程: (1)首先建立MFC的基于对话框程序,命名为“TEST1”

然后在对话框中加入三个编辑框,并用快捷键CTRL+W组合键打开MFC ClassWizard 切换到Member Variables中其中找到IDC_EDIT1、IDC_EDIT2、IDC_EDIT3分别添加对应的3个double型关联变量m_EDIT1_NUM、m_EDIT2_NUM、m_EDIT3_NUM。 关联变量:

在后双击编辑框改变编辑框函数名并添加函数:UpdateData(TRUE);其他两个编辑框均进行此操作。 (2)在对话框中的适当位置添加20个按钮控件实现运算操作: a.操作说明按钮: 鼠标放在按钮控件上,右击鼠标点击属性,改变按钮属性标题为“操作说明”,然后双击控件改变函数名并点击“确定”添加函数代码: void CTEST1Dlg::OnINTR() //计算器操作说明 { // TODO: Add your control notification handler code here

MessageBox("例如M+N=?,在第一个编辑框输入M,第二个编辑框输入N,然后再点击运算符输出结果,减法、乘法、除法、取余等两个数运算的同理。只有一个数进行运算的时候,在第一个编辑框输入数,然后点击运算符输出结果!"); } b.两个数运算的按钮: 与添加“操作说明”按钮类似,比如加法,改变按钮属性标题为“+”,然后双击控件添加函数代码: void CTEST1Dlg::OnADD() //加法运算:m+n { // TODO: Add your control notification handler code here m_EDIT3_NUM=m_EDIT1_NUM+m_EDIT2_NUM; //m_EDIT3_NUM、 m_EDIT1_NUM、m_EDIT2_NUM为三个编辑框的对应关联变量 GetDlgItem(IDC_EDIT2)->ShowWindow(SW_SHOW); //当执行双数运算时,重新显示第二个编辑框 UpdateData(FALSE); } 其他的两个数运算的同理。 注意: GetDlgItem(IDC_EDIT2)->ShowWindow(SW_SHOW);我设计想法是当只有一个操作数运算时隐藏第二个编辑框,此函数就是隐藏与显示的功能。IDC_EDIT2是编辑框的关联地址;SW_SHOW便是执行显示编辑框,此外SW_HIDE是执行隐藏功能后面会用到。

相关文档
相关文档 最新文档