博文

转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
......

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

转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中还有更多的属性......

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

转类传递值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 | ......

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

转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  下一页......

阅读全文(4262) | 评论:1

转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......

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

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);
}
之所以要定义成类的静态成员函数,是因为类的静态......

阅读全文(2757) | 评论:1

转 如何在工作线程中创建窗口? (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......

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

转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_......

阅读全文(8162) | 评论:1

转多线程编程之一——问题提出(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++......

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

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......

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