OnCreate(LPCREATESTRUCT lpCreateStruct) 参数lpCreateStruct参数详解
学生成绩管理系统(详细操作过程)

学生成绩管理系统我将把我的实现步骤完整的写出来,我是在VC 6.0版本下用MFC实现的。
我创建的基于单文档的应用程序,过程不介绍,大家都会。
下面的是我系统菜单:思路:刚进入系统时,只有“登录”菜单可用,其他三个菜单项都是灰色不可用的。
当用户点“进入系统”菜单项时,用户输入用户名、密码和用户类型,系统将根据相应的用户权限使相应的菜单可用,并且“进入系统”菜单项变为不可用。
如:如果用户类型是学生,那么只有学生权限菜单可用,而“教师权限”和“管理员权限”都不可用,同时“进入系统”变为不可用。
“学生权限”下只有“查询成绩”,因为学生只可以查询自己相应的成绩;“教师权限”下有“查询学生成绩”和“增改删学生成绩”两个菜单项,因为教师除了可以查询学生成绩还可以增加、修改和删除学生成绩;“管理员权限”下有“管理学生”和“管理教师”两个菜单项。
整体设计:因为我们要设置系统菜单的状态,所以必须在CMainFrame中添加相应的函数和代码,具体步骤如下:【步骤1】由于系统要使用ODBC类操作数据库,所以需要在stdafx.h中加入代码:#include <afxdb.h>【步骤2】在CMainFrame中的OnCreat()中添加代码如下,实现菜单的初始化工作,当用户没进入系统之前,只有“登陆”菜单下的“进入系统”菜单项可用,而“退出系统”和其他3个权限菜单都不可用,即都是灰色的。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){//使“退出系统”和其他3个权限菜单都不可用,即都是灰色的GetMenu()->GetSubMenu(0)-> EnableMenuItem(1,MF_BYPOSITION | MF_DISABLED | MF_GRAYED);GetMenu()-> EnableMenuItem(1,MF_BYPOSITION | MF_DISABLED | MF_GRAYED);GetMenu()-> EnableMenuItem(2,MF_BYPOSITION | MF_DISABLED | MF_GRAYED);GetMenu()-> EnableMenuItem(3,MF_BYPOSITION | MF_DISABLED | MF_GRAYED);}【步骤3】在CMainFrame中添加自己定义的函数void SetMenuSta(int type),此函数在登陆对话框的OnOK()中被调用,即当用户进入系统后使“进入系统”菜单项不可用,并根据用户类型使相应菜单可用。
VS2010中CMFCToolBar的用法

VS2010中CMFCToolBar的用法自从VS2008中增加了一些特性的菜单,但这些特性在帮助中说明的很少,给使用者造成了很多麻烦。
笔者经过搜索以及自己的摸索,对其的用法有了初步了解,形成本文,如果能够为后来者解决一些问题,笔者将会感到欣慰。
一、向导自动生成的CMFCToolBar由于应用了系统风格,向导生成的菜单确实很漂亮。
如下图:但在某些情况下(至于哪些情况,笔者还不能确定),向导自动生成的菜单会没有名字,在“工具栏和停靠窗口”的子菜单下会显示空。
如下图:出现这种情况的解决办法就是自己给工具栏命个名称。
在CMainFrame::OnCreate()事件中给工具栏命名:int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){……// TODO: 如果您不希望工具栏和菜单栏可停靠,请删除这五行m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockPane(&m_wndMenuBar);DockPane(&m_wndToolBar);m_wndToolBar.SetWi ndowText(_T(“工具栏”)); //这是自己添加的……return 0;}二、自己添加一条工具栏自己添加的工具栏如果按照向导生成的样子去做,在菜单中是不会显示出来的,虽然工具栏已经生成了。
如下图:要想让菜单在“工具栏和停靠窗口”中显示,是不能完全按照向导生成的样子做的。
需要模仿向导生成的样子做但仍有点变化。
(1)创建自已的工具栏在头文件中定义一个工具栏变量。
CMFCToolBar m_wndToolBar2;在CMainFrame::OnCreate()事件中创建并加载工具栏:if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP |CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 :IDR_MAINFRAME)){TRACE0("未能创建工具栏\n");return -1; // 未能创建}//自己创建的工具栏if (!m_wndToolBar2.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY |CBRS_SIZE_DYNAMIC,CRect(1,1,1,1),theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 +1:IDR_MAINFRAME+1) ||!m_wndToolBar2.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 :IDR_MAINFRAME)){TRACE0("未能创建工具栏\n");return -1; // 未能创建}(2)自己的工具栏浮动或停靠窗口// TODO: 如果您不希望工具栏和菜单栏可停靠,请删除这五行m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);m_wndToolBar2.EnableDocking(CBRS_ALIGN_ANY);//自己创建的工具栏EnableDocking(CBRS_ALIGN_ANY);DockPane(&m_wndMenuBar);DockPane(&m_wndToolBar);DockPane(&m_wndToolBar2);//自己创建的工具栏这时候再运行程序会显示如下图:(3)给自己的工具栏命名m_wndToolBar2.SetWindowText(_T("我的工具栏"));此时程序运行如下图:三、浮动我的工具栏在以前CToolBar的时候,浮动工具栏可以使用FloatControlBar()函数。
vc中显示时间

.LOG1:在对话框拖一个edit控件,用类向导设置为CString型变量s2:用类向导为XXXXDlg类创建三个Message函数,如下:int CDuihuaDlg::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CDialog::OnCreate(lpCreateStruct) == -1)return -1;// TODO: Add your specialized creation code hereSetTimer(1,1000,NULL);return 0;}void CDuihuaDlg::OnClose(){// TODO: Add your message handler code here and/or call defaultKillTimer(1);CDialog::OnClose();}void CDuihuaDlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultCTime time;time=CTime::GetCurrentTime();CString s1=time.Format("%Y-%m-%d\t");CString s2=time.Format("%H:%m:%S");s=s1+s2;UpdateData(FALSE);CDialog::OnTimer(nIDEvent);}CDuihuaDlg是我的创建的对话框。
CTime 使用总结1.初始化m_begintime=CTime(2004,1,1,0,0,0,-1);//参数依次为year,month,day,hour,minite,second m_endtime =CTime::GetCurrentTime();//当前时间 2.日期比较CTimeSpan span;span=time1-time2;得到两时间的间隔.可以取得span.GetHours().等 3.access数据库查询使用DateDiff()函数,具体参照access帮助CString timesql; timesql.Format(" Where DateDiff('d',%s,'%s')<=0","日期",m_begintime.Format("%Y-%m-%d"));4读取日期字段(odbc) CDBVariant var; recset.GetFieldValue(i,var);s.Format("%d-%d-%d",(var.m_pdate)->year,(var.m_pdate)->month,(var.m_pdate)->day);我知道库函数 localtime() 可以把 time_t 转换成结构 struct tm, 而 ctime() 可以把time_t 转换成为可打印的字符串。
在CFormView或对话框中动态添加CScrollView、CFormView

在CFormView或对话框中动态添加CScrollView、CFormView 在CFormView或对话框中动态添加CScrollView、CFormView本代码可以在CFormView中,根据事先画好的控件位置创建CScrollView也可以在CDialog中创建CScrollView、CFormView等注:若以下代码放在CMainRightView::OnCreate(LPCREATESTRUCT lpCreateStruct)内,则GetDlgItem()函数将调⽤失败,因为此时控件都还未被创建!void CMainRightView::OnInitialUpdate(){CFormView::OnInitialUpdate();// TODO: Add your specialized code here and/or call the base class//获得⽬标位置控件UINT TargetCtrlID = IDC_STATIC_SCROLLVIEW;CWnd *pWnd = this->GetDlgItem(TargetCtrlID);CRect RectTargetCtrl;pWnd->GetWindowRect(RectTargetCtrl);pWnd->DestroyWindow();this->ScreenToClient(RectTargetCtrl);//在⽬标位置动态创建CScrollViewCEMapView *pEMapView = (CEMapView*)RUNTIME_CLASS(CEMapView)->CreateObject();pEMapView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, RectTargetCtrl, this, TargetCtrlID);//使⽤CreateView创建的视图不能⾃动调⽤OnInitialUpdate函数,需要⼈⼯调⽤OnInitialUpdate函数或者发送 WM_INITIALUPDATE消息 pEMapView->OnInitialUpdate();//SetScrollSizes()必须被调⽤,否则运⾏时会出ASSERT错误,当然,也可以在⽬标View内的OnInitialUpdate()中调⽤pEMapView->SetScrollSizes(MM_TEXT, CSize(RectTargetCtrl.Width()-10, RectTargetCtrl.Height()-10));// 使⽤CreateView创建的视图不会⾃动显⽰并且激活,需要⼈⼯操作pEMapView->ShowWindow(SW_SHOW);}注:如果需要在CDialog中创建CScrollView、CFormView,则需要在View中overload、override这些View中以下的4个⽅法,否则会出ASSERT 错误afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message);afx_msg void OnDestroy();virtual void PostNcDestroy();virtual void OnActivateFrame(UINT nState, CFrameWnd* pDeactivateFrame);int CFormViewPrint::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message){// TODO: Add your message handler code here and/or call defaultreturn CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message);}void CFormViewPrint::OnDestroy(){CWnd::OnDestroy();// TODO: Add your message handler code here}void CFormViewPrint::PostNcDestroy(){// TODO: Add your specialized code here and/or call the base classCWnd::PostNcDestroy();}void CFormViewPrint::OnActivateFrame(UINT nState, CFrameWnd* pDeactivateFrame){// TODO: Add your specialized code here and/or call the base classCWnd::OnActivateFrame(nState, pDeactivateFrame);}原因可参考View和Control的区别(如何在对话框上使⽤CView类)CView继承类,和其他窗⼝类的区别,很重要的就是对CDocument类和CFrameWnd类的操作,⽽其中,涉及CDocument类的操作,都进⾏了有效性判断(m_pDocument != NULL),CView类初始化的时候,m_pDocument = NULL,因此并不影响CView类作为控件的使⽤。
用Visual C++实现带阴影弹出窗口的技术

用Visual C++实现带阴影弹出窗口的技术一.问题的提出在WINDOWS的WINHELPER帮助系统中大量使用一类带阴影的弹出窗口, 这类窗口非常简洁,并具有立体感,它们用来显示一些只读信息.此类弹出窗口不同于一般的窗口,它们没有标题和滚动杆,但都具有带阴影的边框, 并且其窗口的大小随显示字符串多少而自动调节,当显示信息弹出之后,任何来自键盘或鼠标的消息都将导致弹出窗口的消失。
然而WINDOWS API接口中没有现成的函数来实现此项功能,即使是最新版的VISUAL C++ MFC也没有提供现成的类和函数来实现带阴影的此类窗口。
为此,笔者基于面向对象的程序设计思想,从CWnd派生一个新类来实现这个功能,并且将该类窗口的所有函数完全封装在一起,使用就像调用“ MessageBox()”函数显示信息一样简单。
二.实现方法的几个关键部分说明如下,要解决怎样画非用户区的问题:当WINDOWS需要创建一个窗口时,它发送两个消息:WM_NCPAINT和WM_PAINT到应用程序消息队列。
WM_NCPAINT用于重画窗口的非用户区,如标题,边框和滚动杆,本程序正是响应WM_NCPAINT消息来重画带阴影的弹出窗口的边框;画客户区很简单,只需响应WM_PAINT消息处理字符的显示即可.2.如何动态调整弹出窗口的尺寸:大家知道,在一个矩形内显示文本串时,常用函数DrawText(HDC hDC,LPTSTR lpszText,int cbCount,RECT FAR* lpRect,UINT fuFormat).但是,此时我们的带阴影的弹出窗口并为建立.当然不能利用它来显示.然而,我们注意到上述函数中的最后一个参数FuFormat, 它是文字格式的组合,其中有一个鲜为人知的参数DT_CALCRECT, 使用这个参数,字符串不显示,但它根据当前字体测量待显示串的高度, 本程序正是根据这个参数来确定弹出窗口的大小,并以此建立一个随字符串大小而变化的窗口,下面给出其实现该功能的片断: void CShadowWnd::ShowText(CString sText) dc.CreateDC("DISPLAY",NULL,NULL,NULL); //创建一个显示设备描述表dc.SelectObject(GetStockObject(SYSTEM_FONT)); //选择字体到设备描述表CRect rect(0,0,MAXWIDTH,0);////获得待显示的字符串sText 的实际高度和宽度,并将其存入矩形rect中dc.DrawText(sText,rect,DT_WORDBREAK|DT_CENTER|DT_CALCRECT|DT_NOPREFIX);3.怎样获取对系统的控制权:在带阴影的弹出窗口显示之后,怎样获取对系统的控制权,使得当用户按下键盘任意键或鼠标时都将使带阴影的弹出窗口消失,这里采取的方法是,当弹出窗口创建和显示之后,立即进入一个消息循环,从应用程序队列中获取所有消息,并判断是否为鼠标消息或键盘消息,如是,则摧毁窗口结束,并将控制权归还给调用程序.实现片断如下://进入消息循环,获取全部消息,控制整个系统MSG Msg;BOOL bDone;SetCapture();bDone=FALSE;while(!bDone){if(PeekMessage(&Msg,NULL,0,0,PM_REMOVE))if(Msg.message==WM_KEYDOWN||Msg.message==WM_SYSKEYDOWN|| Msg.message==WM_LBUTTONDOWN||Msg.message==WM_RBUTTONDOWN) bDone=TRUE;else{TranslateMessage(&Msg);DispatchMessage(&Msg);}}ReleaseCapture();DestroyWindow();……}. 带阴影的类CShadowWnd 类的头文件及其实现文件的全部细节//头文件:#if !defined(AFX_SHADOWWND_H__B971A958_59CC_11D2_AC8F_0060084237F6__INCLUDED_) #define AFX_SHADOWWND_H__B971A958_59CC_11D2_AC8F_0060084237F6__INCLUDED_#if _MSC_VER >= 1000#pragma once#endif // _MSC_VER >= 1000// ShadowWnd.h : header file///////////////////////////////////////////////////////////////////////////////// CShadowWnd windowclass CShadowWnd : public CWnd{// Constructionpublic:CShadowWnd();// Attributespublic:// Operationspublic:// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CShadowWnd)public:virtual BOOL Create(const RECT& rect, CWnd* pParentWnd); //}}AFX_VIRTUAL// Implementationpublic:CString m_sShowText;void ShowReadOnlyText(CString sText);CBrush m_bmpBrush;virtual ~CShadowWnd();// Generated message map functionsprotected://{{AFX_MSG(CShadowWnd)afx_msg void OnNcPaint();afx_msg void OnPaint();afx_msg int OnCreate(LPCREA TESTRUCT lpCreateStruct);//}}AFX_MSGDECLARE_MESSAGE_MAP()};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCA TION}}// Microsoft Developer Studio will insert additional declarations immediately before the previous line.#endif // !defined(AFX_SHADOWWND_H__B971A958_59CC_11D2_AC8F_0060084237F6__INCLUDED_)//实现文件}// ShadowWnd.cpp : implementation file//#include "stdafx.h"#include "Shadow.h"#include "ShadowWnd.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif//定义常数static int aPattern[]={0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55};//阴影位图数组#define SPOPUP_SHADOWWIDTH 10 //阴影宽度#define SPOPUP_SHADOWHEIGHT 13 //阴影高度#define MAXWIDTH 400 //显示字符矩形的最大宽度/////////////////////////////////////////////////////////////////////////////// CShadowWndCShadowWnd::CShadowWnd(){CBitmap bmp;bmp.CreateBitmap(8,8,1,1,(void* )aPattern);//创建一个阴影位图m_bmpBrush.CreatePatternBrush(&bmp); //创建一把阴影刷}CShadowWnd::~CShadowWnd(){}BEGIN_MESSAGE_MAP(CShadowWnd, CWnd)//{{AFX_MSG_MAP(CShadowWnd)ON_WM_NCPAINT()ON_WM_PAINT()ON_WM_CREA TE()//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CShadowWnd message handlersBOOL CShadowWnd::Create(const RECT& rect, CWnd* pParentWnd){// TODO: Add your specialized code here and/or call the base classconst char* pClassName=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW);return CWnd::CreateEx(WS_EX_STATICEDGE,pClassName, "Shadow window", WS_POPUP,rect.left,rect.top,rect.right,rect.bottom,pParentWnd->GetSafeHwnd(),0,NULL);}void CShadowWnd::OnNcPaint(){// TODO: Add your message handler code hereCWindowDC dc(this);CRect rc;GetWindowRect(&rc);rc.right-=rc.left; //widthrc.bottom-=rc.top; //heightrc.top=0;rc.left=0;m_bmpBrush.UnrealizeObject();CBrush* OldBrush=dc.SelectObject(&m_bmpBrush);//画底部阴影dc.PatBlt(rc.left+SPOPUP_SHADOWWIDTH,rc.bottom-SPOPUP_SHADOWHEIGHT, rc.right-SPOPUP_SHADOWWIDTH,SPOPUP_SHADOWHEIGHT,PATCOPY);//画右边阴影dc.PatBlt(rc.right-SPOPUP_SHADOWWIDTH,rc.top+SPOPUP_SHADOWHEIGHT,SPOPUP_SHADOWWIDTH,rc.bottom,PA TCOPY);dc.SelectObject(OldBrush); //restore old brushCBrush* pBrush=CBrush::FromHandle(GetSysColorBrush(COLOR_WINDOWFRAME)); rc.right-=SPOPUP_SHADOWWIDTH;rc.bottom-=SPOPUP_SHADOWHEIGHT;dc.FrameRect(rc,pBrush); //画边框// Do not call CWnd::OnNcPaint() for painting messages}void CShadowWnd::OnPaint(){CPaintDC dc(this); // device context for painting// TODO: Add your message handler code hereCRect rect;GetClientRect(&rect);rect.left+=5; rect.top+=5;rect.right-=SPOPUP_SHADOWWIDTH;rect.bottom-=SPOPUP_SHADOWHEIGHT;dc.SetTextColor(RGB(0,0,255));//设置显示文本颜色dc.DrawText(m_sShowText,rect,DT_WORDBREAK|DT_NOPREFIX);// Do not call CWnd::OnPaint() for painting messages}void CShadowWnd::ShowReadOnlyText(CString sText){m_sShowText=sText; //存入显示字符串CDC dc;dc.CreateDC("DISPLAY",NULL,NULL,NULL); //创建一个显示设备描述表dc.SelectObject(GetStockObject(SYSTEM_FONT)); //选择字体到设备描述表CRect rect(0,0,MAXWIDTH,0);//获得待显示的字符串sText 的实际高度和宽度dc.DrawText(sText,rect,DT_WORDBREAK|DT_CENTER|DT_CALCRECT|DT_NOPREFIX); //为矩形留些余量rect.right+=3*SPOPUP_SHADOWWIDTH;rect.bottom+=3*SPOPUP_SHADOWHEIGHT;this->Create(rect,0);//创建窗口this->ShowWindow(SW_SHOW); //显示窗口this->UpdateWindow(); //立刻更新窗口//进入消息循环,获取全部消息,控制整个系统MSG Msg;BOOL bDone;SetCapture();bDone=FALSE;while(!bDone){if(PeekMessage(&Msg,NULL,0,0,PM_REMOVE))if(Msg.message==WM_KEYDOWN||Msg.message==WM_SYSKEYDOWN|| Msg.message==WM_LBUTTONDOWN||Msg.message==WM_RBUTTONDOWN) bDone=TRUE;else{TranslateMessage(&Msg);DispatchMessage(&Msg);}}ReleaseCapture();DestroyWindow();}int CShadowWnd::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CWnd::OnCreate(lpCreateStruct) == -1)return -1;// TODO: Add your specialized creation code hereCenterWindow();return 0;}四.使用方法:1. 将该类增加到一个项目文件中2. 在你欲使用函数的类(一般为视类或框架窗口类)中增加一个成员变量(如:CshadowWnd m_ShadowWnd),当需要使用带阴影的弹出窗口显示信息时,调用成员函数(如: m_ShadowWnd.ShowText(String sText)即可,无须考虑其实现细节本程序在Visual C++ 5.0环境下编译通过.此例也说明了对于WINDOWS 下的程序设计,必须掌握OOP 方法,同时也体现出VISUAL C++ MFC类库的强大功能.。
OnInitialUpdate详解

{
OnUpdate(NULL, 0, NULL);
// initial update
}
CView 基类中的 OnUpdate 函数
void CView::OnUpdate(CView* pSender, LPARAM /*lHint*/, CObject* /*pHint*/) {
ASSERT(pSender != this); UNUSED(pSender); // unused in release builds
// TODO: Add your specialized creation code here CRect rect(20,20,100,50); m_ctrlButton.Create("Button1",WS_CHILD|WS_VISIBLE,rect,this,NULL); //创建按扭控件 CFont *pFont=CFont::FromHandle((HFONT)::GetStockObject(ANSI_VAR_FONT)); CRect rect1(150,20,350,100); m_combobox.Create(WS_CHILD|WS_VISIBLE|CBS_SIMPLE|CBS_NOINTE GRALHEIGHT|WS_VSCROLL,rect1,this,NULL); return 0; }
函数被调用—》用户编辑数据: CMyView 类中函数对 CMyDocument 数据成
员进行更新—》退出程序: CMyView 对象被删除—》CMyDocument 对象被
删除
在 MFC 程序设计中,按照传统的设计,如果处理 WM_PAINT 消息,一般 会派生一个 OnPaint 函数,映射到 WM_PAINT 消息上进行绘图处理。但是很 多程序中并没有出现 OnPaint,一个 OnDraw 函数做了更多的绘图操作。而 在消息映射的列表中,也没有见到 WM_PAINT 到 OnDraw 的映射。
C++MFC(13)-双缓冲技术实现绘图

C++MFC(13)-双缓冲技术实现绘图双缓冲即在内存中创建⼀个与屏幕绘图区域⼀致的对象,先将图形绘制到内存中的这个对象上,再⼀次性将这个对象上的图形拷贝到屏幕上,这样能⼤⼤加快绘图的速度。
MARK⼀下实现步骤,略去了项⽬的绘画代码,亲测有效。
我程序中是在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)CMainFrame::OnSize()CDC MemDC; //⾸先定义⼀个显⽰设备对象CBitmap MemBitmap;//定义⼀个位图对象 //随后建⽴与屏幕显⽰兼容的内存显⽰设备MemDC.CreateCompatibleDC(NULL); //这时还不能绘图,因为没有地⽅画 ^_^MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //建⽴⼀个与屏幕显⽰兼容的位图,⾄于位图的⼤⼩嘛,可以⽤窗⼝的⼤⼩,也可以⾃⼰定义CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //将位图选⼊到内存显⽰设备中MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //先⽤背景⾊将位图清除⼲净,这⾥我⽤的是⽩⾊作为背景 你也可以⽤⾃⼰应该⽤的颜⾊//绘图内容MemDC.MoveTo(……); MemDC.LineTo(……); pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); //将内存中的图拷贝到屏幕上进⾏显⽰MemDC.SelectObject(pOldBit); MemBitmap.DeleteObject(); MemDC.DeleteDC();。
VC C 如何防止程序同时启动多次

下面的 InitInstance、OnCreate 和 OnDestroy 函数代码将实现上述的操作:
BOOL CEllipseWndApp::InitInstance() { // 用应用程序名创建信号量 HANDLE hSem = CreateSemaphore(NULL, 1, 1, m_pszExeName);
================再其他============
用命名的互斥! 在你的程序启动是先判断一个互斥 A 有没有,如果互斥 A 不存在,就说明该程序没 有启动,则启动该程序 并创建该互斥 A,在程序结束时销毁互斥 A
对以上代码的补充: 查看代码和 VC 的帮助后,发现问题在于原文在创建信号量和设置寻找标记时使 用 的是 CWinApp 的成员变量 m_pszExeName,该成员变量其实是应用程序执行文件 的名 称去掉扩展名后的部分,而不是应用程序名。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
工具栏进行设置LPCREA TESTRUCT是一个指向结构CREA TESTRUCT的指针.以下是该结构的信息:The CREA TESTRUCT structure defines the initialization parameters passed to the window procedure of an application.typedef struct tagCREA TESTRUCT { // csLPVOID lpCreateParams;HINSTANCE hInstance;HMENU hMenu;HWND hwndParent;int cy;int cx;int y;int x;LONG style;LPCTSTR lpszName;LPCTSTR lpszClass;DWORD dwExStyle;} CREA TESTRUCT;MemberslpCreateParamsContains additional data which may be used to create the window. If the window is being created as a result of a call to the CreateWindow or CreateWindowEx function, this member contains the value of the lpParam parameter specified in the function call.If the window being created is an MDI window, this member contains a pointer to an MDICREA TESTRUCT structure.Windows NT: If the window is being created from a dialog template, this member is the address of a SHORT value that specifies the size, in bytes, of the window creation data. The value is immediately followed by the creation data. For more information, see the following Remarks section.hInstanceHandle to the module that owns the new window.hMenuHandle to the menu to be used by the new window.hwndParentHandle to the parent window, if the window is a child window. If the window is owned, this member identifies the owner window. If the window is not a child or owned window, this member is NULL.cySpecifies the height of the new window, in pixels.cxSpecifies the width of the new window, in pixels.ySpecifies the y-coordinate of the upper left corner of the new window. If the new window is a child window, coordinates are relative to the parent window. Otherwise, the coordinates are relative to the screen origin.xSpecifies the x-coordinate of the upper left corner of the new window. If the new window is a child window, coordinates are relative to the parent window. Otherwise, the coordinates are relative to the screen origin.styleSpecifies the style for the new window.lpszNamePointer to a null-terminated string that specifies the name of the new window.lpszClassPointer to a null-terminated string that specifies the class name of the new window.dwExStyleSpecifies the extended style for the new window.RemarksWindows NT: Y ou should access the data represented by the lpCreateParams member using a pointer that has been declared using the UNALIGNED type, because the pointer may not be DWORD aligned. This is demonstrated in the following example:typedef struct tagMyData{// Define creation data here.} MYDA TA;typedef struct tagMyDlgData{SHORT cbExtra;MYDA TA myData;} MYDLGDA TA, UNALIGNED *PMYDLGDA TA;PMYDLGDA TA pMyDlgdata =(PMYDLGDA TA) (((LPCREA TESTRUCT) lParam)->lpCreateParams);The WM_CREA TE message is sent when an application requests that a window be created by calling the CreateWindowEx or CreateWindow function. The window procedure of the new window receives this message after the window is created, but before the window becomes visible. The message is sent before the CreateWindowEx or CreateWindow function returns.WM_CREA TElpcs = (LPCREA TESTRUCT) lParam; // structure with creation dataParameterslParamV alue of lParam. Pointer to a CREA TESTRUCT structure that contains information about the window being created. The members of CREA TESTRUCT are identical to the parameters of the CreateWindowEx function.Return V aluesIf an application processes this message, it should return 0 to continue creation of the window. If the application returns –1, the window is destroyed and the CreateWindowEx or CreateWindow function returns a NULL handle.QuickInfo工具栏何志丹主要内容:1,概要。
2,常用函数3,实例。
4,动态建立工具条5,在工具栏中嵌控件6,用对话框加位图按钮作工具条我们可以在资源编辑器的ToolBar上单击右键,选择Insert ToolBar,选中一个工具栏后,在右边双击它的一项就可以编辑了。
我们可以用图形工具条及颜色盒画它的外表,它的属性有ID,长,宽及鼠标指向它时的说明。
一般CToolBar定义在CMainFrame中,其实现在CMainFrame的OnCreate函数中完成。
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY |CBRS_SIZE_DYNAMIC) ||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)){TRACE0("Failed to create toolbar ");return -1; // fail to create}m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);Bool Create(CWnd *pParentWnd,DWORD dwStu;e = WS_CHILD | WS_VISIBLE |CBRS_TOP,UINT nID = AFX_IDW_TOOLBAR);pParentWnd指定所属窗口。
dwStyle 指定工具栏风格CBRS_TOP 允许工具栏位于框架窗口顶端。
CBRS_BOTTOM 允许工具栏位于框架窗口底端CBRS_NOALIGN 父窗口改变尺寸后工具栏位置不变CBRS_TOOLTIPS 工具栏显示提示条CBRS_SIZE_DYNAMIC 工具幸是动态的CBRS_SIZE_FIXED 工具栏是固定的CBRS_FLOATING 工具栏是浮动的CBRS_FLYBY 当鼠标从命令按钮上掠过时显示提示信息CBRS_HIDE_INPLACE 工具栏对用户不可见SetButtonStyle()函数用来设定命令按钮的风格或间隔区,或设为一组,按钮的风格决定了按钮的外貌和对用户的反应方式.Void SetButtonStyle(int nIndex,UINT nStyle);nIndex 指定工具栏中按钮或间隔的索引号.nStyle TBBS_BUTTON 标准按钮,此为默认值TBBS_SEPARATOR 间隔区TBBS_CHECKBOX 自动确认区TBBS_GROUP 标记为一组按钮的开始TBBS_CHECKGROUP 标记为一组确认框的开始ControlBar类的EnableDocking函数和CFrameWnd类的DockControlBar函数配合,设定工具栏的可活动性.Void EanbleDocking(DWORD dwStyle)CBRS_ALIGN_TOP 允许工具栏位于客户区上侧CBRS_ALIGN_BOTTOM 允许工具栏位于客房区下侧CBRS_ALIGN_LEFT 允许工具栏位于客户区左侧CBRS_ALIGN_RIGHT 允许工具栏位于客户区右侧CBRS_ALIGN_ANY 允许工具栏位于客户区的任意位置CBRS_FLOAT_MULTI 允许多个控制栏在一个迷你框架窗口中浮动Void DockControlBar(….)pBar 要浮动的控制栏指针.nDockBarID指定允许浮动的位置,或为0则不允许浮动,可以由下列值组合而成:AFX_IDW_DOCKBAR_TOP 控制栏置于框架窗口上侧;AFX_IDW_DOCKBAR_BOTTOM 控制栏置于框架窗口下侧AFX_IDW_DOCKBAR_LEFT 控制栏置于框架窗口左侧AFX_IDW_DOCKBAR_RIGHT 控制栏置于框架窗口右侧改变工具栏的命令按钮风格,工具栏的按钮一般默认为命令按钮,当放开标鼠标,命令按钮就”弹出来”,如果我们希望命令按钮能留在被按上的状态,就可以把命令按钮的风格设为确认框。