博文
转VC++(Create()函数,窗口建立)(2007-10-22 11:11:00)
摘要:BOOL Create(LPCTSTR lpszClassName,//注册类,MFC将注册类封装,我们填写NULL
LPCTSTR lpszWindowName,//窗体名,窗体标题
DWORD dwStyle = WS_OVERLAPPEDWINDOW,//窗体风格
const RECT& rect = rectDefault,//窗体的矩形区域
CWnd* pParentWnd = NULL, // 父窗体指针
LPCTSTR lpszMenuName = NULL, //窗体的菜单
DWORD dwExStyle = 0,//窗体扩展风格
CCreateContext* pContext = NULL);//框架窗体的视图和文档信息,一般填NULL
......
转MessageBox用法(2007-10-19 09:26:00)
摘要:消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合。
1.
MessageBox("这是一个最简单的消息框!");
2.
MessageBox("这是一个有标题的消息框!","标题");
3.
MessageBox("这是一个确定 取消的消息框!","标题", MB_OKCANCEL );
4.
MessageBox("这是一个警告的消息框!","标题", MB_ICONEXCLAMATION );
5.
MessageBox("这是一个两种属性的消息框!","标题", MB_ICONEXCLAMATION|MB_OKCANCEL );
6.
if(MessageBox("一种常用的应用","标题",MB_ICONEXCLAMATION|MB_OKCANCEL)==IDCANCEL)
return;
附其它常用属性
系统默认图标,可在消息框上显示
X错误 MB_ICONHAND, MB_ICONSTOP, and MB_ICONERROR
?询问 MB_ICONQUESTION
!警告 MB_ICONEXCLAMATION and MB_ICONWARNING
i信息 MB_ICONASTERISK and MB_ICONINFORMATION
按钮的形式
MB_OK 默认
MB_OKCANCEL 确定取消
MB_YESNO 是否
MB_YESNOCANCEL 是否取消
返回值
IDCANCEL 取消被选
IDNO 否被选
IDOK 确定被选
IDYES 是被选
补充:
以上消息框的用法是在CWnd的子类中的应用,如果不是,则要MessageBox(NULL,"ddd","ddd",MB_OK); 或MessageBox(hWnd,"ddd","ddd",MB_OK); hWnd为某窗口的句柄,或者直接用AfxMessageBox。
这里所列出的属性只是一些常用属性,在MSDN中还有更多的属性......
转类传递值Dialog & Windows 使用技巧(2007-10-16 11:49:00)
摘要:作者:lixiaosan
日期:04/11/2006
文章不断更新中,请访问这里
注:以下代码以一个名为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_STYLE,
GetWindowLong(this->m_hWnd, GWL_STYLE) |
WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
UpdateWindow();
4. 使能对话框右上角关闭按钮
在OnInitDialog中
方法一:
CMenu* menu = GetSystemMenu(FALSE);
menu->ModifyMenu(SC_CLOSE, MF_BYCOMMAND | ......
转Install Shield安装程序制作图解(2007-10-15 13:22:00)
摘要:
摘要: 本文介绍了利用Install Shield制作应用程序安装软件的方法。在文中作者除了对常用的一些技术进行介绍外,还对安装过程位图的显示、标题和背景的定制等高级技术作了简要的阐述,本文所述方法能够满足大多数安装软件的制作需求。
关键字: 安装软件制作;Install Shield
阅读导航
程序框架的建立
1、建立安装程序工程
2、工作区中的选项卡的功能
3、当前属性的修改
4、脚本代码分析
必要的完善
1、添加程序文件
2、创建快捷方式
3、编写脚本代码
安装程序的发布
1、发布媒介向导对话框
2、Builder Type向导页
3、Tag File向导页
4、Platform向导页
界面设计
1、修改启动画面
2、定制标题
3、定制背景颜色
4、显示位图
前言
InstallShield是一种非常成功的应用软件安装程序制作工具,以其功能强大、灵活性好、容易扩展和强大的网络支持而著称,并因此成为目前最为流行的安装程序专业制作工具之一。该软件不仅提供了灵活方便的向导支持,也允许用户通过其内建的脚本语言InstallScript来对整个安装过程在代码级上进行修改,可以象VC等高级语言一样对安装过程进行精确控制。InstallShield也是Visual C++附带的一个安装程序制作工具,在VC安装结束前将会询问用户是否安装Install Shiled工具,如果当时没有安装,也可以在使用时单独从VC安装盘进行安装。本文将结合一个具体的实例来对InstallShield的使用做一个较为全面的介绍,使读者能够初步掌握使用InstallShield制作专业水准的安装程序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 下一页......
转CFileDialog的扩展名问题 (2007-09-19 10:48:00)
摘要:使用MFC的CFileDialog类保存文件时,遇到了一个小小的问题,当我在文件名栏中写入带扩展名的名字时,CFileDialog不判断该扩展名是否符合我的要求。比如我规定的扩展名是.vvt。当输入a.bmp时我预期想得到的文件名应该是a.bmp.vvt。但是系统依然给我返回a.bmp.vvt。(word实现了这个功能,大家可以实验一下,咳咳)
怎么办?
我在点击OK的时候修改了不就完了。于是乎,baidu,google,MSDN。。。。+实验实验。最后搞定了,办法如下:
重载OnFileNameOK()
BOOL CMyFileDlg::OnFileNameOK()
{
……
//如果扩展名不是我想要的进行以下修改
//修改窗口显示
CString str;
CComboBox *pcmb13=(CComboBox *)GetParent()->GetDlgItem(cmb13);
pcmb13->GetWindowText(str);
str+=_T(".vvt");
pcmb13->SetWindowText(str);
pcmb13->RedrawWindow();
//修改路径值
CS......
AfxBeginThread函数初探(2007-09-17 09:46:00)
摘要:您正在看的VC是:AfxBeginThread函数初探。
在进行多线程程序设计的时候,我们经常用到AfxBeginThread函数来启动一条线程
该函数使用起来非常的简单方便,其定义如下
CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,//线程函数地址
LPVOID pParam,//线程参数
int nPriority = THREAD_PRIORITY_NORMAL,//线程优先级
UINT nStackSize = 0,//线程堆栈大小,默认为1M
Dword dwCreateFlags = 0,//
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
Dword dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
参数说明:
pfnThreadProc:线程函数的地址,该参数不能设置为NULL,线程函数必须定义成全局函数或者类的静态成员函数
例如:
UINT myThreadFunc(LPVOID lparam)
或者
class A
{
public:
static UINT __stdcall myThreadFunc(LPVOID lparam);
}
之所以要定义成类的静态成员函数,是因为类的静态......
转 如何在工作线程中创建窗口? (2007-09-17 09:45:00)
摘要:在前面我们研究了使用AFX_MANAGE_STATE(AfxGetStaticModuleState())进行DLL间的资源切换,以及工作线程中创建Windows消息循环的原理,以为就可以搞定一切类似问题了…但是请看以下代码
DWORD CTestMFCDlg::ThreadFunc(PVOID yy)
{
CAboutDlg dlg;
dlg.DoModal();
return 0;
}
void CTestMFCDlg::OnOK()
{
::CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,NULL,NULL);
}
在VC++6.0上编译运行出现以下ASSERT。
void CWnd::AssertValid() const
{
……
CHandleMap* pMap = afxMapHWND();
……
CObject* p;
ASSERT((p = pMap->LookupPermanent(m_hWnd)) != NULL ||
(p = pMap->LookupTemporary(m_hWnd)) != NULL);
ASSERT((CWnd*)p == this); // must be us
MFC有一个全局的Hash表(通过afxMapHWND()获得),用于把HWND句柄与MFC的封装对象CWnd进行关联,这样就可以通过CWnd::FromHandle()等函数把CWnd对象Attach到一个已有的HWND句柄上,利用MFC的封装函数可以简化对HWND的直接操作。很显然,这里的Assert是因为CWnd对象根据自身的窗口句柄(m_hWnd)从Hash表里找到CWnd对象指针与对象的本身(this)并不相同!这说明,CWnd对象创建时注册到的Hash表与目前检索的Hash表并不是同一个。为什么会是这样的呢?
CHandleMap* PASCAL afxMapHWND(BOOL bCreate)
{
AFX_MODULE_THR......
转MFC的资源切换AFX_MANAGE_STATE(AfxGetStaticMo(2007-09-16 12:48:00)
摘要:以前写MFC的DLL的时候,总会在自动生成的代码框架里看到提示,需要在每一个输出的函数开始添加上AFX_MANAGE_STATE(AfxGetStaticModuleState())。一直不明白这样做的含义,也一直没有这样做,而且代码也工作得好好的,所以感觉这好像一句废话。
最近的项目中,需要在DLL里使用MFC生成界面,这才发现一旦资源放在不同的动态库里,而且还和多线程搅和在一起的时候,事情就变得异常的复杂,以前对MFC的一知半解已经不足与应付了。程序莫名的崩溃,莫名的ASSERT,资源怎样也装载不起来,为什么呢?每次,总是尝试着,在每一个线程的开始,把AFX_MANAGE_STATE(AfxGetStaticModuleState())添加上去,或者在某些地方用AfxSetResourceHandler()一把,然后问题就解决了,但是不是很明白到底是怎么回事,总感觉这种解决办法让人很不安心,仿佛在下一秒问题又会突然冒出来。
前天,这个问题终于发挥到了极致,任我花费了好几个小时,怎样的尝试都不能成功,在项目的关键时候发生这种事情,让我暗暗发誓以后再也不用MFC了。正像很多的电影情节一样,事情最后还是得到了解决,这次我决定不能再这么算了,一定要把这个事情理解得明明白白。
在这里,我遇到的问题就是,如何让DLL里的界面代码使用该DLL的资源(Resource),如何在工作线程里加载有IE控件的对话框?
我问同事,他们是如何实现DLL资源切换的?AFX_MANAGE_STATE(AfxGetStaticModuleState())这就是他们的答案,一如微软的推荐,原来就是这么简单啊!让我们来看看,这句代码到底做了什么?
#define AFX_MANAGE_STATE(p) AFX_MAINTAIN_STATE2 _ctlState(p);
AFX_MAINTAIN_STATE2::AFX_MAINTAIN_STATE2(AFX_MODULE_STATE* pNewState)
{
m_pThreadState = _afxThreadState;
m_pPrevModuleState = m_......
转多线程编程之一——问题提出(2007-09-16 10:54:00)
摘要:多线程编程之一——问题提出
作者:韩耀旭
下载源代码
一、问题的提出
编写一个耗时的单线程程序:
新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX_SECOND,标题为“延时6秒”,添加按钮的响应函数,代码如下: void CSingleThreadDlg::OnSleepSixSecond()
{
Sleep(6000); //延时6秒
}
编译并运行应用程序,单击“延时6秒”按钮,你就会发现在这6秒期间程序就象“死机”一样,不在响应其它消息。为了更好地处理这种耗时的操作,我们有必要学习——多线程编程。
二、多线程概述
进程和线程都是操作系统的概念。进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。
线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。
每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,所以线程间的通讯非常方便,多线程技术的应用也较为广泛。
多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。由此可见,如果两个非常活跃的线程为了抢夺对CPU的控制权,在线程切换时会消耗很多的CPU资源,反而会降低系统的性能。这一点在多线程编程时应该注意。
Win32 SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。Visual C++......
vc picture控件的使用(转)(2007-09-15 17:37:00)
摘要:
vc picture控件的使用
作者:佚名
vc picture控件的分类进行拉总结,
(一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID)
(二) 动态载入图片(即只需要在程序中指定图片的路径即可载入)
为方便说明,我们已经建好一个基于对话框的工程,名为Ttest.
对话框类为CTestDlg
(一) vc picture控件非动态载入图片.
方法1.先从最简单的开始,用picture 控件来实现.
步骤:
先在资源里Import一张图片,ID为IDB_BITMAP2
然后在对话框上添加一个picture控件,右键点击打开属性,
将type下拉框选择BITMAP,紧跟着下面就出现一个Image下拉框,
拉开就会看到所有已经载入好的图片,
选择你要的图片.运行程序即可看到.
方法2vc picture控件.通过背景图
同样如上,先载入一张图片,ID为IDB_BITMAP2
TestDlg.h中
CBrush m_brBk;//在public中定义
TestDlg.cpp中
在初始化函数OnInitDialog()中加入:
BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP2);
m_brBk.CreatePatternBrush(&bmp);
bmp.DeleteObject();
return......