一.UNICODE编码
1.Windows下定义的Unicode的数据类型有哪些?
WCHAR unicode字符 PWSTR 指向Unicode字符串的指针
PCWSTR 指向一个恒定的UNICODE的字符串的指针。
对应的ANSI数据类型为CHAR,LPSTR和LPCTSTR
ANSI/UNICODE通用数据类型为TCHAR,PTSTR,LPCTSTR
2.如何对Unicode进行操作
ANSI 操作函数以str开头 strcpy
Unicode 操作函数以wcs开头 wcscpy
MBCS 操作函数以_mbs开头 _mbscpy
ANSI/Unicode 操作函数以_tcs开头 _tcscpy(C运行期库)
ANSI/Unicode 操作函数以lstr开头 lstrcpy(Windows函数)
3.如何表示Unicode字符串常量?
字符集 实例
ANSI “string”
Unicode L“string”
ANSI/Unicode T(“string”)或_TEXT(“string”)
if( szError[0] == _TEXT(‘J’) )
4.如何编写符合ANSI和Unicode的应用程序?
(1) 将文本串视为字符数组,而不是chars数组或字节数组。
(2) 将通用数据类型(如TCHAR和PTSTR)用于文本字符和字符串。
(3) 将显式数据类型(如BYTE和PBYTE)用于字节、字节指针和数据缓存。
(4) 将TEXT宏用于原义字符和字符串。
(5) 执行全局性替换(例如用PTSTR替换PSTR)。
(6) 修改字符串运算问题。例如函数通常希望在字符中传递一个缓存的大小,而不是字节。这意味着不应该传递sizeof(szBuffer),而应该传递(sizeof(szBuffer)/sizeof(TCHAR)。另外,如果需要为字符串分配一个内存块,并且拥有该字符串中的字符数目,那幺请记住要按字节来分配内存。这就是说,应该调用
malloc(nCharacters *sizeof(TCHAR)),而不是调用malloc(nCharacters)。
二、Windows打印
TCHAR szprinter[80];
HDC hdcprint; // 定义一个设备环境句柄
//定义一个打印作业
static DOCINFO di={sizeof(DOCINFO),_T("printer"),NULL};
// 得到设备字符串存入数组szprinter中
GetProfileString(_T("windows"),_T("device"),_T(",,,"),szprinter,80);
TCHAR *szDevice=wcstok(szprinter,_T(","));
TCHAR *szDriver=wcstok(NULL,_T(","));
TCHAR *szOutput=wcstok(NULL,_T(","));
// 将设备字符串分解
//if(NULL!=(szDevice=strtok(szprinter,","))&&NULL!=(szDriver=strtok(NULL,","))&&
//NULL!=(szOutput=strtok(NULL,",")))
// 创建一个打印机设备句柄
if((hdcprint=CreateDC(szDriver,szDevice,szOutput,NULL))!=0)
{
if(StartDoc(hdcprint,&di)> 0) //开始执行一个打印作业
{
StartPage(hdcprint); //打印机走纸,开始打印
SaveDC(hdcprint); //保存打印机设备句柄
// 输出一行文字
TextOut(hdcprint,1,1,_T("热烈祝贺编程实例出版发行!"),16);
RestoreDC(hdcprint,-1); //恢复打印机设备句柄
EndPage(hdcprint); //打印机停纸,停止打印
EndDoc(hdcprint); //结束一个打印作业
//MessageBox("打印完毕!","提示",MB_ICONINFORMATION);
}
// 用API函数DeleteDC销毁一个打印机设备句柄
DeleteDC(hdcprint);
// }
// else
// {
//MessageBox("没有默认打印机,或者没有安装打印机!");
// return true;
// }
}
return true;
//使用默认的打印机直接打印
三、设置背景颜色
1.先定义CBrush m_brush;
然后在初始发m_brush.CreateSolidBrush( RGB( 255, 255, 255 ) );
重载OnCtlColor //指示即将绘制一个控件
HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
pDC-> SetBkMode( TRANSPARENT );
pDC-> SetTextColor( RGB( 0, 128, 128) );
// TODO: Return a different brush if the default is not desired
if( nCtlColor == CTLCOLOR_DLG )
return (HBRUSH) m_brush.GetSafeHandle( );
if( nCtlColor == CTLCOLOR_STATIC )
return (HBRUSH) m_brush.GetSafeHandle( );
/**************************************************/
LOGBRUSH logbrush;
COLORREF bkcolor(RGB(117,119,117));
logbrush.lbHatch = 0;
logbrush.lbStyle = BS_SOLID;
logbrush.lbColor =bkcolor;
logbrush.lbColor =bkcolor;
HBRUSH m_hBrush=(HBRUSH)::CreateBrushIndirect(&logbrush);//使用这个
/*******************************************************/
return hbr;
}
对话框背景颜色
OnEraseBkgnd中实现;
CBrush br;
Rect rc;
br.CreateSolidBrush(RGB(0,0,0));
GetClientRect(&rc); //取得客户区边界
pDc->FillRect(&rc,&br);
初始化Instance中
//设置对话框背景和文本颜色
SetDialogBkColor(RGB(160,180,220),RGB(0,0,0));