博文

真彩工具条的实现(2006-12-08 14:32:00)

摘要:在实现高彩色工具条之前,先研究一下普通16色的工具条的实现过程,并从中总结出改进方法。在VC的资源视图中工具条是一个资源名为IDR_MAINFRAME的Toolbar型资源,并可通过在编辑按钮上的图标来完成工具条上图标的绘制。虽然在资源视图中工具条上各按钮的图标是相互独立的,但在存储时并非像图标一样保存为ico格式文件而是以bmp位图格式保存在磁盘上的。该位图是一个由工具条上的按钮图标组成的长条型位图图像,中间没有任何缝隙,在程序运行和在资源视图对工具条进行编辑时该图像首先装载到一个图像列表中,然后工具栏根据索引依次从图像列表中将图像显示到工具条的各个按钮上。由于VC限制工具栏上的图标不能超出16色,因此不论是在资源视图直接编辑位图还是用复制粘贴等手段均无法获取超出256色的工具条(注:用复制粘贴的方法虽然在编辑视图中可以暂时显示出256色的图标,但在程序运行时仍会退化成16色)。

  由于不能在资源视图中通过编辑Toolbar资源实现16色以上的图标,加之工具条在显示时有并不直接从Toolbar获取图标而是从图像列表中读取,因此可以通过其他一些图像处理软件做好类似于工具条的bmp图像(仅颜色比普通工具条bmp图像丰富,其余完全一样),并以位图的形式加入到程序资源。在使用时,先将其读取到图像列表,这样图像列表中用于显示到工具条上的图标的颜色就可以是256、24位、甚至32位色的了。由于工具条缺省时将直接加载资源名为IDR_MAINFRAME的Toolbar型资源作为图标的来源,因此还必须通过SetImageList()函数将含有高彩色工具条位图的图像列表指定为工具条的图标来源。

  真彩工具条的实现

  由于工具条的创建是在主框架类的OnCreate()函数中完成的,因此高彩色图像的装载和图像列表的替换工作必须也在此进行。在进行程序设计之前,需要做好各种准备工作,比如高彩色工具条位图的绘制、高彩色位图加入到资源等。绘制工具条位图时,必须控制好图像的尺寸,如需要有N个边长为 M的图标,那么需要绘制的位图尺寸为长=N*M;宽=M。真彩位图在加入到工程之后就不能再在VC的资源视图中进行编辑了。由于这个彩色位图仅起到美化界面的作用,因此具体对的事件响应等工作还要通过设置原有的Toolbar资源来完成。

  准备工作就绪......

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

VC在ODBC下实现数据库报表(2006-12-06 23:45:00)

摘要:void CMy112View::OnDraw(CDC* pDC)
{
 CMy112Doc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // TODO: add draw code for native data here/
 CString line;
 TEXTMETRIC metrics;
 int y=0;
    int tabstop[]={200,375,600,950};
 CFont TitleFont;
 CFont HeadingFont;
 CFont DetailFont;
 Roomrs.Open(CRecordset::snapshot,_T("select * from room"));
 Roomrs.Requery();
 TitleFont.CreateFont(36,0,0,0,FW_BOLD,false,false,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
        CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"宋体");
 HeadingFont.CreateFont(18,0,0,0,FW_BOLD,false,true,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
        CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"宋体");
 DetailFont.CreateFont (18,0,0,0,FW_NORMAL,false,false,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
      &......

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

VC++6.0中使用复选框和单选钮(2006-11-28 22:21:00)

摘要:VC++6.0中使用复选框和单选钮
  单选钮用来表示一系列的互斥选项,这些互斥项常常被分成若干个组,每组仅允许用户选择一个选项;复选框与单选按钮相象,不同之处是复选框代表多重选择,用户可以选择一个或多个选项。   对话框编辑器中各组控件的对齐

  按下Ctrl键并单击要对齐的各个控件,同时选中。最后选中的控件是对齐的基准,仔细观察,它周围的8个小方框是实心的,而其它被选控件周围的小方框是空心的。

  在Layout菜单中选择Make Same Size的Both,可以统一控件尺寸,所选控件尺寸与基准控件相同。在Layout菜单中选择Align的Left,可以使所有被选控件的左边与基准控件对齐。选择Layout菜单中Align的Space Evenly的Down,可以使被选控件垂直间距相等。   单选按钮和复选框的使用
  为了方便说明,我们假定创建了基于对话框的MFC应用程序,工程名为RadioAndCheckButton。对话框资源加入两个组框 ,第一个组框‘性别’,内有‘男’,‘女’两个单选钮;第二个组框是‘爱好’,内有‘足球’‘排球’‘蓝球’三个复选框,如下表: 控件类型 ID 标题(Caption) 其它属性 组框 缺省 性别 缺省 单选钮 IDC_SEX1 男 Group 单选钮 IDC_SEX2 女 缺省 组框 缺省 爱好 缺省 复选框 IDC_HOBBY1 足球 缺省 复选框 IDC_HOBBY2 排球 缺省 复选框 IDC_HOBBY3 蓝球 缺省   设置控件的Tab Order

  单击Layout菜单下的Tab Order命令,设置控件的TAB键顺序(Tab Order),保证单选钮的Tab Order连续。

  以Tab Order为序,从Group属性为真的控件开始(包括该控件),到下一个Group属性为真的控件结束(不包括该控件),所有的这些控件将组成一个组。对于单选钮,同一组内同时只能有一个处于被选中状态。对于由资源编辑器生成的单选按钮控件,在默认情况由Windows自动处理同组控件之间的互斥关系。

  具体使用单选钮和......

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

DLL有关基本知识(2006-11-28 12:44:00)

摘要:简介 loadTOCNode(1, 'summary'); 对于“适用于”一节中列出的 Microsoft Windows 操作系统,操作系统的大量功能是由动态链接库 (DLL) 提供的。另外,当您在这些 Windows 操作系统之一上运行某一程序时,该程序的很多功能可能是由 DLL 提供的。例如,某些程序可能包含很多不同的模块,而该程序的每个模块都包含在 DLL 中并从中分发。

使用 DLL 有助于促进代码的模块化、代码重用、内存的有效使用和减少所占用的磁盘空间。因此,操作系统和程序能够更快地加载和运行,并且在计算机中占用较少的磁盘空间。

当程序使用 DLL 时,一个称为依赖性的问题可能导致该程序无法运行。当程序使用 DLL 时,就会创建一个依赖项。如果其他程序改写和损坏了该依赖项,原来的那个程序就可能无法成功运行。

在引入 Microsoft .NET Framework 之后,大多数依赖性问题都已经通过使用程序集消除了。   更多信息 loadTOCNode(1, 'moreinformation'); 什么是 DLL? loadTOCNode(2, 'moreinformation'); DLL 是一个包含可由多个程序同时使用的代码和数据的库。例如,在 Windows 操作系统中,Comdlg32 DLL 执行与对话框有关的常见函数。因此,每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框。这有助于促进代码重用和内存的有效使用。

通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个计帐程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。

此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,您可能具有一个工资计算程序,而税率每年都会更改。当这些更改被隔离到 DLL 中以后,您无需重新生成或安装整个程序就可以应用更新。

下表说明了 Windows 操作系统中的一些作为 DLL 实现的文件: • ActiveX 控件 (.ocx) 文件
Ac......

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

CTime COleDateTime的常用操作和比较(2006-11-27 23:00:00)

摘要:  CTime类 1) 获取当前时间。
CTime time;
time = CTime::GetCurrentTime();
2) 获取时间元素。
int year = time.GetYear() ;
int month = time.GetMonth();
int day = time.GetDay();
int hour = time.GetHour();
int minute = time.GetMinute();
int second = time.GetSecond();
int DayOfWeek = time.GetDayOfWeek() ;
3) 获取时间间隔。
CTimeSpan timespan(0,0,1,0); // days,hours,minutes,seconds
timespan = CTime::GetCurrentTime() - time;
4) 把时间转换为字符串。
CString sDate,sTime,sElapsed Time ;
sDate = time.Format("%m/%d/%y"); //ex: 12/10/98
sTime = time.Format("%H:%M:%S"); //ex: 9:12:02
sElapsed Time = timespan.Format("%D:%H:%M:%S");
// %D is total elapsed days
要想知道更多的时间格式,参见M F C文档中的strftime。
使用COleDateTime类
1) 获得一年中的某一天。
COleDate Time datetime;
datetime = COleDateTime::GetCurrentTime();
int DayOfYear = datetime.GetDayOfYear();
2) 从文本串中读取时间。
COleDate Time datetime;
datetime.ParseDateTime("12:12:23 27 January 93");
说明。
CTime和COle......

阅读全文(15169) | 评论:3

CString,string,char*的综合比较(一)(2006-11-21 18:40:00)

摘要:概述 string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中; CString(typedef CStringT<TCHAR, StrTraitMFC<TCHAR>> CString)为Visual C++中最常用的字符串类,继承自CSimpleStringT类,主要应用在MFC和ATL编程中,主要数据类型有char(应用于ANSI),wchar_t(unicode),TCHAR(ANSI与unicode均可); char*为C编程中最常用的字符串指针,一般以’\0’为结束标志; (二)  构造 ²        string是方便的,可以从几乎所有的字符串构造而来,包括CString和char*; ²        CString次之,可以从基本的一些字符串变量构造而来,包括char*等; ²        char*没有构造函数,仅可以赋值; ²        举例: char* psz = “joise”; CString cstr( psz ); string str( cstr ); (三)  运算符重载 a)       operator= ²        string是最方便的,几乎可以直接用所有的字符串赋值,包括CString和char*; ²        CString次之,可以直接用些基本的字符串赋值,包括char*等; ²        char*只能由指针赋值,并且是极危险的操作,建议使用st......

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

第一个win32程序的学习笔记(2006-11-18 12:36:00)

摘要:#include <windows.h>
#include <stdio.h> LRESULT CALLBACK WinSunProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);
//wParam lParam 为消息的附加信息,均为整型。例如按下A键,附加信息为A的ASCII码
//主函数
int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance当前实例句柄
  HINSTANCE hPrevInstance,  // handle to previous instance前一个实例句柄
  LPSTR lpCmdLine,          // command line命令行参数
  int nCmdShow              // show state显示状态
)
{ /*------------设计窗口--------------------*/
 WNDCLASS wndcls;//创建窗口类对象
 wndcls.cbClsExtra=0;//类附加字节数
 wndcls.cbWndExtra=0;//窗口......

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

如何遍历文件夹中的所有文件?(2006-10-22 14:48:00)

摘要:如何遍历文件夹中的所有文件?
void CFileTreeDlg::BrowseFile(int CallNum, CString strFile)
{
   CallNum++;
   CFileFind ff;
   CString szDir = strFile;
 
   if(szDir.Right(1) != "\\")//字符串右边第一个字符为"\\"
   szDir += "\\";
 
   szDir += "*.*";
 
   BOOL res = ff.FindFile(szDir);//确认是否存在
   while(res)
   { res = ff.FindNextFile();
     if(ff.IsDirectory() && !ff.IsDots())
     {
 //如果是一个子目录,用递归继续往深一层找
 CString strPath = ff.GetFilePath();
 CString strTitle = ff.GetFileTitle();
 int i =0;
 switch(CallNum)
 {
    case 1:
            strHTFir = m_FileTree.InsertItem(strTitle,0,0,NULL);          break;
    case 2:
   ......

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

如何使用“浏览文件夹”选择对话框? (2006-10-22 14:47:00)

摘要:有时我们需要获得某个文件夹的路径,而不是文件的路径,这时需要用API函数SHBrowseForFolder来实 现。 函数原型为: LPITEMIDLIST SHBrowseForFolder(LPBROWSEINFO lpbi); 其中LPBROWSEINFO为BROWSEINFO结构的指针。 BROWSEINFO结构如下: typedef struct _browseinfo { HWND hwndOwner;
LPCITEMIDLIST pidlRoot;
LPSTR pszDisplayName;
LPCSTR lpszTitle;
UINT ulFlags;
BFFCALLBACK lpfn;
LPARAM lParam;
int iImage; } BROWSEINFO; 调用例子如下:
void CTestDlg::OnBtndlg()
{
 CString sFolderPath;//用来存储路径
 char szPath[MAX_PATH]={0};//用来得到,你选择的活页夹路径,相当于提供一个缓冲区
    BROWSEINFO m_bi;
 //初始化入口参数bi开始
BIF_RETURNONLYFSDIRS,只有用户选择的是文件夹时“确定”按钮才有效。
BIF_STATUSTEXT 创建一个状态窗口,你可以设置其文本
m_bi.ulFlags=80;实现如图:在文件夹浏览对话框上加一个新建文件夹按钮。
    m_bi.ulFlags = BIF_RETURNONLYFSDIRS  | BIF_STATUSTEXT;
    m_bi.hwndOwner = GetSafeHwnd(); //得到父窗口Handle值
    m_bi.pidlRoot = NULL;
    m_bi.lpszTitle ="网上邻居";     //设置标题
 &nbs......

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

debug和release的区别(2006-10-19 18:48:00)

摘要:Debug版本包括调试信息,所以要比Release版本大很多(可能大数百K至数M)。至于是否需要DLL支持,主要看你采用的编译选项。如果是基于ATL的,则Debug和Release版本对DLL的要求差不多。如果采用的编译选项为使用MFC动态库,则需要MFC42D.DLL等库支持,而Release版本需要MFC42.DLL支持。Release  Build不对源代码进行调试,不考虑MFC的诊断宏,使用的是MFC  Release库,编译十对应用程序的速度进行优化,而Debug  Build则正好相反,它允许对源代码进行调试,可以定义和使用MFC的诊断宏,采用MFC  Debug库,对速度没有优化。    
 
 
一、Debug  和  Release  编译方式的本质区别  
 
Debug  通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release  称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。  
Debug  和  Release  的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd  /Fo,但区别并不重要,通常他们也不会引起  Release  版错误,在此不讨论)  
 
Debug  版本:  
/MDd  /MLd  或  /MTd  使用  Debug  runtime  library(调试版本的运行时刻函数库)  
/Od  关闭优化开关  
/D  "_DEBUG"  相当于  #define  _DEBUG,打开编译调试代码开关(主要针对  
assert函数)  
/ZI  创建  Edit  ......

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