Window程序设计的细节

1. error C2065: “CString”: 未声明的标识符

在非mfc下使用CString 会导致上面错误:

解决办法:

(1)如果你使用VC.net那么:使用MFC:包含cstringt.h;

                                                   不使用MFC:包含atlstr.h

 (2)或者 #include <afx.h>

参考来源:http://blog.csdn.net/xlm289348/article/details/7851654   博主:xlm289348


2. CPoint类 简介

CPoint类与Windows POINT结构类似。它还包括用来操纵CPoint和POINT结构的成员函数。
只要POINT结构可以使用的地方,CPoint对象也可以使用。这个类与“大小”有关的操作符可以接受CSize对象或SIZE结构,因为这两者是可以互换的。
注意:这个类派生于tagPOINT结构(名字tagPOINT是POINT结构的不太常用的有关名字)。这意味着POINT结构的数据成员,x和y,也是CPoint的可以访问的数据成员。
#include "atltypes.h"

参考来源:百度百科

3. GetLastError()

在VC中编写应用程序时,经常需要涉及到错误处理问题。许多函数调用只用TRUE和FALSE来表明函数的运行结果。一旦出现错误,MSDN中往往会指出请用GetLastError()函数来获得错误原因。

可问题是,GetLastError()返回的只是一个双字节数值(DWORD)。

目前Win32的出错编号已经从0排到11031,而这还不是错误编码的全部。因为错误代码还在不断增加。
没有人愿意自己去查出错编码所对应的错误信息。

Windows(Windows95以上, Window NT3.1以上)已经提供了现成的错误信息处理函数:FormatMessage()。

 以下是用FormatMessage()得到由GetLastError()返回的出错编码所对应错误信息的示例:

LPVOID lpMsgBuf;
FormatMessage(
	FORMAT_MESSAGE_ALLOCATE_BUFFER |
	FORMAT_MESSAGE_FROM_SYSTEM |
	FORMAT_MESSAGE_IGNORE_INSERTS,
	NULL,
	GetLastError(),
	MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
	(LPTSTR) &lpMsgBuf,
	0,
	NULL
);

// Process any inserts in lpMsgBuf.
// ...

// Display the string.
MessageBox((LPCTSTR)lpMsgBuf, _T("Error"), MB_OK | MB_ICONINFORMATION );

// Free the buffer.
LocalFree( lpMsgBuf );

参考来源:http://www.seacha.com/article.php/knowledge/windows/mfc/2011/0423/335.html

4. WM_KILLFOCUS和WM_SETFOCUS

当windows将输入焦点从一个窗口转换到另一个窗口时,它首先给正在失去焦点的窗口发一个WM_KILLFOCUS消息,wParam参数是接收输入焦点的窗口的句柄,

然后window向正在接收输入焦点的窗口发送一个WM_SETFOCUS消息,同时wParam是还在失去输入焦点的窗口的句柄,

(WPARAM为NULL表示没有窗口拥有或正在接收输入焦点)

写个示例:父窗口可以阻止子窗口获得输入焦点.

case WM_KILLFOCUS:
 Sethwnd = (HANDLE)wParam ;
 if (hwnd == GetParent((HWND)wParam))
{
    SetFocus(hwnd) ;
} 
break ;

具体参看MSDN

参考来源:http://blog.csdn.net/hgy413/article/details/6440878 博主:花熊


5. 无法解析的外部符号 _WinMain@16


 
Ctrl+F7 编译的时候没有错误,而F6生成解决方案的时候出现如下两个错误:
 
1:error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 MSVCRTD.lib
 
2: error LNK1120: 1 个无法解析的外部命令

出这个错误可能有以下几个原因:
 
一、新建项目是控制台应用程序而程序通过的是WinMian(及windows入口函数)
 
因为新建项目的时候选择的是控制台应用程序,控制台应用程序的入口是main。而在.CPP文件中提供的是windows入口函数WinMian。
 
解决办法:
 
(1)项目->属性->配置属性->C/C++ ->预处理器 中的【预处理器定义】 删除“_CONSOLE” 添加 “ _WINDOWS”
 
(2)项目->属性->配置属性->连接器->系统中的【子系统】设置为Windows(/SUBSYSTEM:WINDOWS)
 
(3)生成->重新生成解决方案
 
二、WinMain的UNICODE版和ANSI版不匹配
 
为了支持UNICODE,C运行库对WinMain其实区分了UNICODE版和ANSI版。对UNICODE版的程序,C运行库调用wWinMain,而对于ANSI版的则调用WinMain。
 
解决办法:
 
(1)将代码中的 int APIENTRY _tWinMain 替换为 int WINAPI wWinMain 或(int WINAPI wWinMain 替换为 int APIENTRY _tWinMain )
 
(2)生成->重新生成解决方案

参考来源:http://blog.csdn.net/ghevinn/article/details/8697404           博主:hevin

6. error C2440: “类型转换”: 无法从“overloaded-function”转换为“LPTHREAD_START_ROUTINE”

void CscanTestDlg::OnBnClickedScan()
{
	// TODO: 在此添加控件通知处理程序代码
	hThrd=NULL;
	if(!hThrd)
	{
		hThrd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)GetDateFromScannerThread,NULL,0,NULL);
	}
	
}

error C2440: “类型转换”: 无法从“overloaded-function”转换为“LPTHREAD_START_ROUTINE”

原因在于:把类的非静态成员函数传给CreateThread了
可以用静态成员函数包装一下,然后把这个静态成员函数跟对象的指针(this)同时传给CreateThread,

然后在函数中恢复出this指针,再从对象指针上调用你的非静态成员函数。


 
7. UNICODE下memset的使用

在多字节程序中,memset及ZeroMemory的使用很清楚,如:

char  str[10];

memset(str,0,10)或memset(str,0,sizeof(str));

ZeroMemory(str,10)或ZeroMemory(str,sizeof(str))

其中:sizeof(str)==10;

在UNICODE下,应该这样用:

TCHAR  str[10];

memset(str,0,20)或memset(str,0,sizeof(str));

ZeroMemory(str,20)或ZeroMemory(str,sizeof(str))

memset(str,'\0',sizeof(str))或memset(str,'\0',20)

memset(str,TEXT('\0'),10*sizeof(TCHAR));

其中:sizeof(str)==20,str字符串分配的内存字节数;若用 wcslen(str),应该是str字符串的实际个数(有效字符个数);

=================================================

在定义时也可以将内存清0,如:TCHAR str[10]=_T("");

   TCHAR str[10]=_T("");

等同于

   TCHAR  str[10];

    memset(str,0,20);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值