博文

【转】VC++ 中实现进制2进制,10进制,16进制的相互转换     (2007-09-19 17:17:00)

摘要:作者:lixiaosan
日期:04/14/2006

下面是一个图例表示转换过程使用的函数

                                        BinToDec                 CString::Format
                               2 --------------------------> 10 ---------------------------> 16
                               2 <-------------------------- 10 <--------------------------- 16
                                        DecToBin     ......

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

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

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

转 如何在VC的release编译中使用断点调试(摘抄)     (2007-09-18 17:15:00)

摘要:我们在使用VC的时候,肯定都很喜欢VC在Debug下面强大调试功能,但有时候不可避免的会遇到这样的问题:在Debug环境下运行很好的程序在Release运行有问题。所以如果有办法在Release环境下实现断点调试,常常可大大节省在Release版本中找存在问题的时间。你只需要按以下设置,你就可以实现在Release版本中的断点调试。   就这么简单!!! 不过,有很多时候这样设置的Release环境有可能你的程序就不再出问题了。 小提示: 在很多时候,我们的程序会不定期的出现一个非常操作的对话框,这时,如果安装了VC,按取消按钮可以进入调试状态,不幸的是调试时全是汇编代码,不容易找出源代码的错误位置。此时,如果你按以上的方法进行设置,按取消按钮可看到的信息就很多了,相应找错误就比较容易了。 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1543987
......

阅读全文(3649) | 评论: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);
}
之所以要定义成类的静态成员函数,是因为类的静态......

阅读全文(7023) | 评论: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......

阅读全文(14291) | 评论: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_......

阅读全文(12452) | 评论: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++......

阅读全文(6800) | 评论: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......

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

DLL中调用Dialog的奇怪现象 (2007-09-14 14:43:00)

摘要:DLL中调用Dialog的奇怪现象 发布时间:2007-5-20 0:45:46  
我在一个DLL中使用一个对话框,该对话框中使用了一个custom控件,该控件在Exe中可以正常使用,但是在DLL中使用时,DoModal()返回-1,对话框不显示,这是为什么?  
---------------------------------------------------------------  
 
在DllMain中PROCESS_ATTACH的时候调用CoInitialize(),在PROCESS_DETACH的时候调用CoUnInitialize()  
---------------------------------------------------------------  
 
http://www.vchome.net/tech/dll/dll44.htm  
在Dll中创建对话框并调用  
作者:freedk  
 
下载本文示例代码  
 
1、第一步创建一“MFC  AppWizard  (dll)”工程,接下来选择“Regular  Dll  using  shared  MFC  DLL”,点击“Finish”。  
 
2、添加一对话框资源到工程中,从菜单中选择Insert->Resource,添加一“Dialog”  
选择“New”,至此对话框已添加到DLL工程中。  
 
3、为对话框添加一新类,如:CTest,基类为CDialog。  
 
4、在MFCDLL.cpp中(因创建的工程为MFCDLL)添加接口函数:  
 
extern  "C"  __declspec(dllexport)  void  Show()  <......

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

VC中使用CFileDialog进行文件操作(2007-09-14 13:30:00)

摘要: 一般来讲你不需要派生新的类,因为基类已经提供了常用的功能。而且在创建并等待对话框结束后你可以通过成员函数得到用户在对话框中的选择。

CFileDialog文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下:
CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );参数意义如下:

bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。
lpszDefExt 指定默认的文件扩展名。
lpszFileName 指定默认的文件名。
dwFlags 指明一些特定风格。
lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。参数格式如:
"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。
pParentWnd 为父窗口指针。
创建文件对话框可以使用DoModal(),在返回后可以利用下面的函数得到用户选择:
CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名如:c:\test\test1.txt
CString CFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名如:test1.txt
CString CFileDialog::GetExtName( ) 得到完整的文件扩展名,如:txt
......

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