Windows Programming Tips

  •  htoi 实现

标准C库有htoa, 但是不包含htoi, 这个我觉得是非常常用, 所以记录如下

int htoi(char *s)

{

    char *digits = "0123456789ABCDEF";

    if (islower (s[0]))

        s[0]=toupper(s[0]);

    if (islower (s[1]))

        s[1]=toupper(s[1]);

    return 16 * (strchr(digits, s[0]) -strchr (digits,'0'))+(strchr(digits,s[1])-strchr(digits,'0'));

}

 

  • 和CEdit中关联的CString如何换行

当你把一个CEdit和一个CString关联的时候, 使用传统的/n是无法实现换行, 要使用/r/n才能实现

 

  • 关于AfxGetMainWnd in a worker thread

AfxGetMainWnd是无法在工作线程里面正常工作的, 如果使用了, 总是返回NULL, 解决方法是使用替代函数 AfxGetApp()->m_pMainWnd

 

  • 如何在CSliderCtrl 动态添加 Mark

在 CreateEx 的时候记得加上 TBS_AUTOTICKS 就好了

 

  • malloc 和 calloc 的区别

函数malloc()和函数calloc() 的主要区别是前者不能初始化所分配的内存空间,而后者能。如果由malloc()函数分配的内存空间原来没有被使用过,则其中的每一位可能都是0;反之, 如果这部分内存曾经被分配过,则其中可能遗留有各种各样的数据。函数calloc() 会将所分配的内存空间中的每一位都初始化为零。

 

  • windows 对于int8_t、int16_t、int32_t和int64_t 的支持问题

C99中对整数的移植方法进行了修正,在新增加的头文件inttypes.h中定义了整数类型的一些别名,便于程序移植。但是可惜的是vs2005还是不支持。但是微软在VC中定义了扩展的C++关键字:__int8、__int16、__int32和__int64;在Windows API定义了INT32、INT64、UINT32和UINT64等数据类型;在.NET框架也定义了Int16、Int32、Int64、UInt16、UInt32和UInt64等结构类型。

 

  •  mbstowcs 只会在高位填充0x00的问题

如果不加 setlocale(LC_ALL, "chs")的话,mbstowcs它只会在高字节添加0x00,setlocale(LC_ALL, "chs")后在用mbstowcs 就没问题的了

 

  • DECLARE_DYNCREATE 和 DECLARE_DYNAMIC 的区别

DECLARE_DYNAMIC 宏能够提供运行是类型判断能力,它允许你在运行时处理类名和类层次中的位置,允许你做有意义的诊断Dump。
DECLARE_DYNCREATE 宏除了能够提供类型判断能力外,还能够提供动态创建对象的能力。

 

  • Project : error PRJ0050: 未能注册输出。请确保您有修改注册表的相应权

使用vs 2005写ocx控件,遇到Project : error PRJ0050: 未能注册输出。请确保您有修改注册表的相应权限错误的解决。看了半天,我是管理员权限,删除debug也不行。最后发现把所有第三方dll都拷贝到ocx所在目录就行了。

  •  Cannot find CRuntimeClass. Class not defined

有时候明明写了DECLARE_DYNCREAT和IMPLEMENT_DYNCREATE,或者写了DECLARE_SERIAL和IMPLEMENT_SERIAL。但是

就是无法动态创建库,这种情况通常是因为你的这个类在整个程序中没有显式的使用过,所以构造函数里面的静态函数AfxClassInit没有

被调用,所以这个类就没有注册到动态创建的对象列表中。解决的办法是胡乱找个地方使用下你的类就可以了。

  •  Dialog中OnCreate()和OnInitDialog()的区别

OnCreate是对话框在被创建时的消息,这时候对话框还没有被显示在屏幕上。而且对话框中的控件都还没有被创建。而OnInitDialog()是对话框创建完成,即对话框上的控件也全部被创建后第一次激活显示在屏幕上产生的消息。在此时可以对话框中的控件进行初始化操作。

  • VS2005 在IE中调试 ActiveX控件

先写一个测试控件的HTML



Test

 CLASSID="CLSID:你的控件ID号">
   
   
   
   


然后属性->调试->命令 C:/Program Files/Internet Explorer/iexplore.exe

然后属性->调试->命令参数  test.htm全路径

  • 如何从 ActiveX 控件检索网页的 URL
  1. 重写IOleObject::OnSetClientSite(),准备使用 m_pClientSite。
  2. 获取到客户端站点通过调用 IOleClientSite::GetMoniker() 标记。
  3. 调用 IMoniker::GetDisplayName() 以获取当前文档的 URL。
  • MFC中如何使用正则表达式

可以使用CATLRegExp,详细介绍请看http://www.vckbase.net/document/viewdoc/?id=1256

  • SetConsoleTitle

 需要延时才能使用,暂时不知道是什么原因

  • DrawText函数让多行文本居中显示在一个矩形内,可为什么DT_VCENTER不起作用?       

单行文字才可以用居中,必须使用DT_SINGLELINE属性才可以。 

 

 

  • 设置静态文本/CStatic背景颜色,文字颜色

用SetBkMode(TRANSPARENT)确实能将文字的背景颜色去掉了,可是后面还有灰灰的颜色实际是CStatic控件的背景颜色,而不是文字的。所以尽管设了文字的bkmode,灰灰的颜色还是有。 用CreateSolidBrush(RGB(255, 0, 0)); 然后return   hbrEdit能改变控件背景的颜色,从而和对话框背景一致。可是如果我的背景用的是位图,这个CStatic控件的背景必须是透明,才能和背景融为一体。这点还是没法解决。

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (nCtlColor == CTLCOLOR_STATIC) { HBRUSH hbrEdit = CreateSolidBrush(RGB(255, 0, 0)); pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(0, 255, 0)); return hbrEdit; } return hbr;

你可能感兴趣的:(windows)