vc++汇总

转载 2017年07月05日 16:07:53
一. 代码相关
1. ********vc中debug版程序正常但release版崩溃******* 
I. 内存分配问题 
1. 变量未初始化。 
为debug中会自动给变量初始化found=FALSE,而在release版中 
则不会。所以尽可能的给变量、类或结构初始化。 
2. 数据溢出的问题 
如:char buffer[10]; 
int counter; 
lstrcpy(buffer, "abcdefghik"); 
在debug版中buffer的NULL覆盖了counter的高位,但是除非counter>16M,什么问题也没 
有。但是在release版中,counter可能被放在寄存器中,这样NULL就覆盖了buffer下面 
的空间,可能就是函数的返回地址,这将导致ACCESS ERROR。 
3. DEBUG版和RELEASE版的内存分配方式是不同的 。
如果你在DEBUG版中申请 ele 为 6*sizeof(DWORD)=24bytes,实际上分配给你的是32bytes(debug版以32bytes 
为单位分配), 而在release版,分配给你的就是24bytes(release版以8bytes为单位 
),所以在debug版中如果你写ele[6],可能不会有什么问题,而在release版中,就有ACCESS VIOLATE。这个问题我验证int ele[6], sizeof(ele),release和debug都是24
II. ASSERT和VERIFY 
ASSERT在Release版本中是不会被编译的。 假如你在这些语句中加了程序中必须要有的代码 
比如 
ASSERT(pNewObj = new CMyClass); 
pNewObj->MyFunction(); 
这种时候Release版本中的pNewObj不会分配到空间 ,所以执行到下一个语句的时候程序会报该程序执行了非法操作的错误。这时可以用VERIFY 
III. 参数问题: 
自定义消息的处理函数,必须定义如下: 
afx_msg LRESULT OnMyMessage(WPARAM, LPARAM); 
返回值必须是HRESULT型,否则Debug会过,而Release出错 
IV. 内存分配 
保证数据创建和清除的统一性:如果一个DLL提供一个能够创建数据的函数,那么这个DLL同时应该提供一个函数销毁这些数据。数据的创建和清除应该在同一个层次上。 
V. DLL的灾难 
人们将不同版本DLL混合造成的不一致性形象的称为 “动态连接库的地狱“(DLL Hell) 
如果你的程序使用你自己的DLL时请注意: 
1. 不能将debug和release版的DLL混合在一起使用。debug都是debug版,release版都是release版。 
解决办法是将debug和release的程序分别放在主程序的debug和release目录下 
2. 千万不要以为静态连接库会解决问题,那只会使情况更糟糕 
VI. RELEASE板中的调试 : 
1. 将ASSERT() 改为 VERIFY() 。找出定义在"#ifdef _DEBUG"中的代码,如果在RELEASE版本中需要这些代码请将他们移到定义外。查找TRACE(…)中代码,因为这些代码在RELEASE中也不被编译。 请认真检查那些在RELEASE中需要的代码是否并没有被便宜。 
2. 变量的初始化所带来的不同,在不同的系统,或是在DEBUG/RELEASE版本间都存在这样的差异,所以请对变量进行初始化。 
3. 是否在编译时已经有了警告?请将警告级别设置为3或4,然后保证在编译时没有警告出现. 
VII. 将Project Settings" 中 "C++/C " 项目下优化选项改为Disbale(Debug)。编译器的优化可能导致许多意想不到的错误,请参考[url]http://www.pgh.net/~newcomer/deb[/url]ug_release.htm 
1. 此外对RELEASE版本的软件也可以进行调试,请做如下改动: 
在"Project Settings" 中 "C++/C " 项目下设置 "category" 为 "General" 并且将"D 
ebug Info"设置为 "Program Database"。 
在"Link"项目下选中"Generate Debug Info"检查框。 
"Rebuild All" 
如此做法会产生的一些限制: 
无法获得在MFC DLL中的变量的值。 
必须对该软件所使用的所有DLL工程都进行改动。 
************************************************************* 
2.*******句柄是一个标识符,是拿来标识对象或者项目***** 
它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可 
能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程 
序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以 
使用该句柄,以引用相应的对象 
通用的句柄,就是HANDLE,比如下面的语句: 
HINSTANCE hInstance; 
可以改成: 
HANDLE hInstance;

一般情况下我们在编程的时候,给应用程序分配的 
内存都是可以移动的或者是可以丢弃的,这样能使有限的内存资源充分利用,所以,在 
某一个时候我们分配的那块内存的地址是不确定的,因为他是可以移动的,所以得先锁 
定那块内存块,这儿应用程序需要调用API函数GlobalLock函数来锁定句柄。如下: 
lpMem=GlobalLock(hMem); 
这样应用程序才能存取这块内存。 
********************************************************** 
3.*********要使程序的主窗口不可见,并且不在任务栏上出现任务按钮,要做到这两点,需分 
别设置主边框窗口的风格和扩展风格:*********

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

cs.style =WS_POPUP;//使主窗口不可见

cs.dwExStyle |=WS_EX_TOOLWINDOW;//不显示任务按钮

return CFrameWnd::PreCreateWindow(cs); 

************************************************* 
4.******CString str = "Hello\r\nHow are you\r\n"; 
: 为什么pDC->TextOut(0, 0, str);显示时不能够自动换行? ******

如果你的视图类是CEditView,这样做是行的通的 
但是,如果在CView里面,这样就不行,这也很容易理解 
CView里面没有行的概念,它就像按象素编址的白纸(一个二维平面) 
在白纸上换行,显然是行不通的,因为它不知道下一行的具体位置 
************************************* 
5.*******我想在子线程中直接给视图窗口绘图,而不调用视图类的函数OnDraw(), 
在子线程中获得资源, 
可以在子线程的构造函数中传入CMyThread(CWnd* pWnd,HDC hDC,。。) 
这样,在主线程中创建子线程时 mythread(this,m_pDC->m_hDC) 
其中m_pDC=m_pDC=new CClientDC(this); 
********************************** 

6. ******VC中让程序发出声因 *****
beep() 
******************************** 
7.*******获取当前屏幕分辨率 ******
int nScreenWidth=GetSystemMetrics(SM_CXSCREEN); 
int nScreenHeight=GetSystemMetrics(SM_CYSCREEN); 
************************************ 
8.*******把消息从一个view发到另外一个view ******
在CWinApp里面保存view的指针。然后再任意地方就可以通过AfxGetApp()调用获得 
view的指针。That is ok! 
*********************************** 
9.*******如何在视图类函数中得到HDC句柄 ******
得到可以用GetDC,释放用ReleaseDC,句柄是CDC的成员变量 
返回的是CDC对象,但里面有一个成员变量,好像是m_hCDC之类的 
是句柄 
********************************* 
10*******注册控件 regsvr32 ******
-************************************** 
11.*******CTypePtrArray跟CObArray本质区别 ******
CTypePtrArray有两种基本框架类型,CObArray和CPtrArray,里面的数据类型可以是对象或者指向对象的指针;

所以,它是一个模板类,它的可串行化依赖于它到底是以CObArray还是以CPtrArray为基本框架,它是类型安全的. 
CObArray,顾名思义,是对象的数组,所以里面是存放对象的.它不是模板类,可串行化, 
不是类型安全的. 
************************************** 
12.*******vc中的extern "c" 如何使用? ******
发信站: 武汉白云黄鹤站 (2003年05月16日21:57:11 星期五), 站内信件

假设某个C 函数的声明如下: 
void foo(int x, int y); 
该函数被C 编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。

由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。 
例如: 
extern “C” 

void foo(int x, int y); 
. // 其它函数 

或者写成 
extern “C” 

#include “myheader.h” 
. // 其它C 头文件 

这就告诉C++编译译器,函数foo是个C 连接,应该到库中找名字_foo而不是找_foo_int_int。C++编译器开发商已经对C标准库的头文件作了extern“C”处理, 
***************************************************** 
13.*******VC++下怎样设置栈的大小 ******
方法一:STACKSIZE 定义.def文件

语法:STACKSIZE reserve[,commit] 
reserve:栈的大小;commit:可选项,与操作系统有关,在NT上只一次分配物理内存 
的大小

方法二:设定/STACK

打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后在Reserve中设定堆栈的最大值和commit。

注意:reserve默认值为1MB,最小值为4Byte;commit是保留在虚拟内存的页文件里面,它 
设置的较 
大会使栈开辟较大的值,可能增加内存的开销和启动时间 
********************************************************** 
14.*******鼠标移动到适当的位置时改变光标 ******
void CM_curosrView::OnMouseMove(UINT nFlags, CPoint point) 

// TODO: Add your message handler code here and/or call default 
SetCursor(Cross); 
//

CView::OnMouseMove(nFlags, point); 
}

其中HCURSOR Cross在构造函数中被初始化成 
Cross = AfxGetApp()->LoadStandardCursor(IDC_CROSS);

只要移动,即为十字标 
******************************************************** 
14.*******如何发送一个关于某个按钮单击的消息 ******
试试这两种: 
1、GetDlgItem(IDOK)->PostMessage(BM_CLICK,0,0); 
这种是某位高人说的,没试过。这种是直接发送给按钮窗口的,是窗口消息。

2、PostMessage(WM_COMMAND,IDOK|BN_CLICKED<<16,GetDlgItem(IDOK)->m_hWnd); 
这个是我自己找的一种方法。这个是发送给按钮父窗口的,是通知消息。 
****************************************************** 
*什么函数能获取本地IP 
虽然感觉很滥,直接调用ipconfig。 
这个程序肯定是每台机器有得, 
windows自己保证,所以你调用就可以方便获得了。 
********************************** 
*得到windows和system目录路径的函数 
getwindowsdirectory 
getsystemdirectory 
*********************************** 
1:使用vc开发项目时, 常会遇到这种情况: 即明明只改动了一个文件,却要把整个项目全部重新编译连接一次。 
刚刚连接好,一运行,又提示重新编译连接一次。非常讨厌。 
这是因为出现了 未来文件 的缘故。(vc5的bug?) 
解决方法:找出对应文件夹下的debug目录,将未来文件全部delete, 
再rebuild all一次。(未来 文件即其创建和修改时间都比系统时间靠后)

2: 有时,workspace中的classview显示混乱。其表现如下: 
1:添加的成员变量或函数不能显示; 
2:即使显示出来了变量或函数,双击后不能跳至正确的位置。 
解决方法: 
删除.ncb文件,再rebuld all.

3: 如何干净的删除一个类? 
1:先从workspace中的FileView中删除对应的.h和.cpp文件。 
2.再关闭项目,从实际的文件夹中删除对应的.h和.cpp文件。 
3.灾删除.clw文件。 
打开项目,rebuld all。

4: 老是提示没有找到预编译头
初学者常有这样的疑惑: 
直接望工程文件里加入一个CPP原文件再编译连接的话 
老是提示没有找到预编译头 
解决方法: 
#include "stdafx.h"

5. 通过DLL共享变量 
a. 用#pragma data_seg(“segname”) 创建一个节 
#pragma data_seg(“share”) 
LONG g_lShareData=0; 
#pragma data_seg() 
b. 在连接器的命令行中使用/SECTION:name attributes开关 
//SECTION:share,RWS 
或在源代码中嵌入连接开关: 
#pragma comment(linker,”/SECTION:share,RWS”)

7. 动态连接库的隐式连接 
a. DLL输出函数的头文件:输出函数前加_declspec(dllexport);EXE输入函数的头文件:输入函数前加_delcspec(dllimport)。 
b. 在EXE工程项目设置的Link页面的Object/Libaray Modules 中添加DLL对应的LIB文件( 该文件是在生成DLL的同时生成的)。

8. 用FindFirstChangeNotification(…)来检测文件系统的变化。 
先用FindFirstChangeNotification登记要监测的文件夹,然后用WaitForSingleObject等 
函数来等待文件变化事件的到来,并处理该时间。在处理后如果需要继续监测,那么还要 
调用FindNextChangeNotification(…)。 
*********************************************** 
9.*怎样在c++里得到文件长度 
HANDLE hFile; 
hFile = CreateFile(lpcTheFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, 
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if (hFile != INVALID_HANDLE_VALUE) { 
DWORD dwFileSize = GetFileSize(hFile, NULL); 
CloseHandle(hFile); 

********************************************* 
10. *MessageBox()与AfxMessageBox()的区别 
C 中可调用的涵数大致可分三类: 
1.类自己的涵数,只对类自己的数据成员有作用; 
2.AFX小组在设计 Application Framworks 时设计的全局函数,多冠在Afx前缀,在包含了MFC库/框架的工程中可用; 
3.Windows API的全局函数。对所有Windows平台下的程序设计都可以调用,如Vb,Vc,Dephi等等。 

4. 标准模板库中的函数 (贾添加)

你说的 MessageBox是属于 CWnd 类的成员函数,只能在 CWnd 和CWnd的派生类的对象中调用;AfxMessageBox则可在任何地方调用。 
另外对应的还有: ::MessageBox()这个windows API的全局函数。 
上述中1和3一般有一个区别,就是1要比3少一个参数,即窗口句柄。大家知道,这个句柄是通过 this 指针曲折转换得到的,不用程序员操心了。 
************************************************* 
*VC开发小技巧20个 
发信站: 武汉白云黄鹤站 (2002年11月29日12:56:15 星期五), 转信

一、打开CD-ROM 
mciSendString("Set cdAudio door open wait",NULL,0,NULL); 
二、关闭CD_ROM 
mciSendString("Set cdAudio door closed wait",NULL,0,NULL); 
三、关闭计算机 
OSVERSIONINFO OsVersionInfo; //包含操作系统版本信息的数据结构 
OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 
GetVersionEx(&OsVersionInfo); //获取操作系统版本信息 
if(OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) 

//Windows98,调用ExitWindowsEx()函数重新启动计算机 
DWORD dwReserved; 
ExitWindowsEx(EWX_REBOOT,dwReserved); //可以改变第一个参数,实现注销用户、 
//关机、关闭电源等操作 
// 退出前的一些处理程序 

四、重启计算机 
typedef int (CALLBACK *SHUTDOWNDLG)(int); //显示关机对话框函数的指针 
HINSTANCE hInst = LoadLibrary("shell32.dll"); //装入shell32.dll 
SHUTDOWNDLG ShutDownDialog; //指向shell32.dll库中显示关机对话框函数的指针 
if(hInst != NULL) 

//获得函数的地址并调用之 
ShutDownDialog = (SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60); 
(*ShutDownDialog)(0); 

五、枚举所有字体 
LOGFONT lf; 
lf.lfCharSet = DEFAULT_CHARSET; // Initialize the LOGFONT structure 
strcpy(lf.lfFaceName,""); 
CClientDC dc (this); 
// Enumerate the font families 
::EnumFontFamiliesEx((HDC) dc,&lf, (FONTENUMPROC) EnumFontFamProc,(LPARAM) this,0); 
//枚举函数 
int CALLBACK EnumFontFamProc(LPENUMLOGFONT lpelf, 
LPNEWTEXTMETRIC lpntm,DWORD nFontType,long lparam) 

// Create a pointer to the dialog window 
CDay7Dlg* pWnd = (CDay7Dlg*) lparam; 
// add the font name to the list box 
pWnd ->m_ctlFontList.AddString(lpelf ->elfLogFont.lfFaceName); 
// Return 1 to continue font enumeration 
return 1; 

其中m_ctlFontList是一个列表控件变量 
六、一次只运行一个程序实例,如果已运行则退出 
if( FindWindow(NULL,"程序标题")) exit(0); 


贾的方法:在App类的InitInstance()函数中添加如下代码

HANDLE hMutex = CreateMutex(NULL, TRUE, _T("COOLROID_KDS_CLIENT"));
if ( GetLastError() == ERROR_ALREADY_EXISTS)
{
CString str=_T("出品控制已经启动");
CloseHandle(hMutex);
hMutex = NULL;
// g_lang.LoadString(IDS_ALREADYRUN,str);
AfxMessageBox(str, MB_SYSTEMMODAL);
return FALSE;
}
七、得到当前鼠标所在位置 
CPoint pt; 
GetCursorPos(&pt); //得到位置 
八、上下文菜单事件触发事件:OnContextMenu事件 
九、显示和隐藏程序菜单 
CWnd *pWnd=AfxGetMainWnd(); 
if(b_m) //隐藏菜单 

pWnd->SetMenu(NULL); 
pWnd->DrawMenuBar(); 
b_m=false; 

else 

CMenu menu; 
menu.LoadMenu(IDR_MAINFRAME); ////显示菜单 也可改变菜单项 
pWnd->SetMenu(&menu); 
pWnd->DrawMenuBar(); 
b_m=true; 
menu.Detach(); 

十、获取可执行文件的图标 
HICON hIcon=::ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0); 
if (hIcon &&hIcon!=(HICON)-1) 

pDC->DrawIcon(10,10,hIcon); 

DestroyIcon(hIcon); 
十一、窗口自动靠边程序演示 
BOOL AdjustPos(CRect* lpRect) 
{//自动靠边 
int iSX=GetSystemMetrics(SM_CXFULLSCREEN); 
int iSY=GetSystemMetrics(SM_CYFULLSCREEN); 
RECT rWorkArea; 
BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkAre 
a, 0); 
CRect rcWA; 
if(!bResult) 
{//如果调用不成功就利用GetSystemMetrics获取屏幕面积 
rcWA=CRect(0,0,iSX,iSY); 

else 
rcWA=rWorkArea; 
int iX=lpRect->left; 
int iY=lpRect->top; 
if(iX < rcWA.left + DETASTEP && iX!=rcWA.left) 
{//调整左 
//pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZE); 
lpRect->OffsetRect(rcWA.left-iX,0); 
AdjustPos(lpRect); 
return TRUE; 

if(iY < rcWA.top + DETASTEP && iY!=rcWA.top) 
{//调整上 
//pWnd->SetWindowPos(NULL ,iX,rcWA.top,0,0,SWP_NOSIZE); 
lpRect->OffsetRect(0,rcWA.top-iY); 
AdjustPos(lpRect); 
return TRUE; 

if(iX + lpRect->Width() > rcWA.right – DETASTEP && iX !=rcWA.right-lpRect->W 
idth()) 
{//调整右 
//pWnd->SetWindowPos(NULL ,rcWA.right-rcW.Width(),iY,0,0,SWP_NOSIZE); 
lpRect->OffsetRect(rcWA.right-lpRect->right,0); 
AdjustPos(lpRect); 
return TRUE; 

if(iY + lpRect->Height() > rcWA.bottom – DETASTEP && iY !=rcWA.bottom-lpRect 
->Height()) 
{//调整下 
//pWnd->SetWindowPos(NULL ,iX,rcWA.bottom-rcW.Height(),0,0,SWP_NOSIZE); 
lpRect->OffsetRect(0,rcWA.bottom-lpRect->bottom); 
return TRUE; 

return FALSE; 

//然后在ONMOVEING事件中使用所下过程调用 
CRect r=*pRect; 
AdjustPos(&r); 
*pRect=(RECT)r; 
十二、给系统菜单添加一个菜单项 
给系统菜单添加一个菜单项需要进行下述三个步骤: 
首先,使用Resource Symbols对话(在View菜单中选择Resource Symbols...可以显 
示该对话)定义菜单项ID,该ID应大于0×0F而小于0xF000; 
其次,调用CWnd::GetSystemMenu获取系统菜单的指针并调用CWnd:: Appendmenu将菜单 
项添加到菜单中。下例给系统菜单添加两个新的 
int CMainFrame:: OnCreate (LPCREATESTRUCT lpCreateStruct) 

… 
//Make sure system menu item is in the right range. 
ASSERT(IDM_MYSYSITEM<0xF000); 
//Get pointer to system menu. 
CMenu* pSysMenu=GetSystemMenu(FALSE); 
ASSERT_VALID(pSysMenu); 
//Add a separator and our menu item to system menu. 
CString StrMenuItem(_T ("New menu item")); 
pSysMenu->AppendMenu(MF_SEPARATOR); 
pSysMenu->AppendMenu(MF_STRING, IDM_MYSYSITEM, StrMenuItem); 
… 

十三、运行其它程序 
//1、运行EMAIL或网址 
char szMailAddress[80]; 
strcpy(szMailAddress,"mailto:netvc@21cn.com"); 
ShellExecute(NULL, "open", szMailAddress, NULL, NULL, SW_SHOWNORMAL); 
//2、运行可执行程序 
WinExec("notepad.exe",SW_SHOW); //运行计事本 
十四、动态增加或删除菜单 
1、 增加菜单 
//添加 
CMenu *mainmenu; 
mainmenu=AfxGetMainWnd()->GetMenu(); //得到主菜单 
(mainmenu->GetSubMenu (0))->AppendMenu (MF_SEPARATOR);//添加分隔符 
(mainmenu->GetSubMenu (0))->AppendMenu(MF_STRING,ID_APP_ABOUT,_T("Always on 
&Top")); //添加新的菜单项 
DrawMenuBar(); //重画菜单 
2、 删除菜单 
//删除 
CMenu *mainmenu; 
mainmenu=AfxGetMainWnd()->GetMenu(); //得到主菜单 
CString str ; 
for(int i=(mainmenu->GetSubMenu (0))->GetMenuItemCount()-1;i>=0;i–) //取得菜 
单的项数。 

(mainmenu->GetSubMenu (0))->GetMenuString(i,str,MF_BYPOSITION); 
//将指定菜单项的标签拷贝到指定的缓冲区。MF_BYPOSITION的解释见上。 
if(str=="Always on &Top") //如果是刚才我们增加的菜单项,则删除。 

(mainmenu->GetSubMenu (0))->DeleteMenu(i,MF_BYPOSITION); 
break; 

十五、改变应用程序的图标 
静态更改: 修改图标资源IDR_MAINFRAME。它有两个图标,一个是16*16的,另一个是3 
2*32的,注意要一起修改。 
动态更改: 向主窗口发送WM_SETICON消息.代码如下: 
HICON hIcon=AfxGetApp()->LoadIcon(IDI_ICON); 
ASSERT(hIcon); 
AfxGetMainWnd()->SendMessage(WM_SETICON,TRUE,(LPARAM)hIcon); 
十六、另一种改变窗口标题的方法 
使用语句 CWnd* m_pCWnd = AfxGetMainWnd( ),然后,再以如下形式调用SetWindowText()函数: 
SetWindowText( *m_pCWnd,(LPCTSTR)m_WindowText);// m_WindowText可以是一个CString类的变量。 
十七、剪切板上通过增强元文件拷贝图像数据 
下面代码拷贝通过元文件拷贝图像数据到任何应用程序,其可以放置在CView派生类的函 
数中。 
CMetaFileDC * m_pMetaDC = new CMetaFileDC(); 
m_pMetaDC->CreateEnhanced(GetDC(),NULL,NULL,"whatever"); 
//draw meta file 
//do what ever you want to do: bitmaps, lines, text… 
//close meta file dc and prepare for clipboard; 
HENHMETAFILE hMF = m_pMetaDC->CloseEnhanced(); 
//copy to clipboard 
OpenClipboard(); 
EmptyClipboard(); 
::SetClipboardData(CF_ENHMETAFILE,hMF); 
CloseClipboard(); 
//DeleteMetaFile(hMF); 
delete m_pMetaDC; 
十八、剪切板上文本数据的传送 把文本放置到剪接板上: 
CString source; 
//put your text in source 
if(OpenClipboard()) 

HGLOBAL clipbuffer; 
char * buffer; 
EmptyClipboard(); 
clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1); 
buffer = (char*)GlobalLock(clipbuffer); 
strcpy(buffer, LPCSTR(source)); 
GlobalUnlock(clipbuffer); 
SetClipboardData(CF_TEXT,clipbuffer); 
CloseClipboard(); 

从剪接板上获取文本: 
char * buffer; 
if(OpenClipboard()) 

buffer = (char*)GetClipboardData(CF_TEXT); 
//do something with buffer here 
//before it goes out of scope 

CloseClipboard(); 
十九、将捕捉屏幕图像到剪切版中 
void CShowBmpInDlgDlg::OnCutScreen() 

ShowWindow(SW_HIDE); 
RECT r_bmp={0,0,::GetSystemMetrics(SM_CXSCREEN), 
::GetSystemMetrics(SM_CYSCREEN)}; 
HBITMAP hBitmap; 
hBitmap=CopyScreenToBitmap(&r_bmp); 
//hWnd为程序窗口句柄 
if (OpenClipboard()) 

EmptyClipboard(); 
SetClipboardData(CF_BITMAP, hBitmap); 
CloseClipboard(); 

ShowWindow(SW_SHOW); 

HBITMAP CShowBmpInDlgDlg::CopyScreenToBitmap(LPRECT lpRect) 

//lpRect 代表选定区域 

HDC hScrDC, hMemDC; 
// 屏幕和内存设备描述表 
HBITMAP hBitmap, hOldBitmap; 
// 位图句柄 
int nX, nY, nX2, nY2; 
// 选定区域坐标 

Linux基础课程汇总

-
  • 1970年01月01日 08:00

关于NetShareCheck和NetShareAdd的使用方法

    很多人都对 NetShareCheck和NetShareAdd在VC里的使用感到很困惑,按照定义传入参数后,返回值始终是错误的,最常见的就是ret=123,parm_err=8,最近我在做一个...
  • xiaoxinghappy
  • xiaoxinghappy
  • 2008-03-14 10:05:00
  • 6733

使用 NetShareEnum 遍历本地共享目录需要注意的问题

1 简介 Windows提供了NetShareEnum函数用于实现遍历服务器的共享目录,但在实现该功能时发现一个有关UNICODE和ANSI字符串的问题。 2. 函数原型简介 该函数...
  • Fire_Lord
  • Fire_Lord
  • 2013-01-14 09:33:39
  • 1777

调试的技巧

相关研究表明软件的编写中,大多数时间和精力是花在了调试上。好的调试方法也是编写好程序的关键。下面将介绍常用的集中调试技巧,主要有断言、轨迹、断点等。 1、断言assert 断言就是判断,asser...
  • zj0789
  • zj0789
  • 2013-11-14 16:48:28
  • 547

VC学习日志

********vc中debug版程序正常但release版崩溃******* I. 内存分配问题 1. 变量未初始化。 为debug中会自动给变量初始化found=FALSE,而在release版中...
  • pkeel
  • pkeel
  • 2007-11-01 14:50:00
  • 1117

VC常见错误与技巧

********vc中debug版程序正常但release版崩溃******* I. 内存分配问题 1. 变量未初始化。 为debug中会自动给变量初始化found=FALSE,而在release版中...
  • liquanhai
  • liquanhai
  • 2009-03-23 21:41:00
  • 2118

VC笔记(一)

张明奇(卡哥) ********vc中debug版程序正常但release版崩溃******* I. 内存分配问题 1. 变量未初始化。 为debug中会自动给变量初始化found=FA...
  • L_Andy
  • L_Andy
  • 2012-10-15 09:54:25
  • 2118

vc++汇总

一. 代码相关 1. ********vc中debug版程序正常但release版崩溃*******  I. 内存分配问题  1. 变量未初始化。  为debug中会自动给变量初始化found=FA...
  • jiaxiaokai
  • jiaxiaokai
  • 2017-07-05 16:07:53
  • 243

VC学习日志

********vc中debug版程序正常但release版崩溃******* I. 内存分配问题 1. 变量未初始化。 为debug中会自动给变量初始化found=FALSE,而在release版中...
  • pkeel
  • pkeel
  • 2007-11-01 14:50:00
  • 1117

【转帖】用Win32 API设置windows XP中FAT32文件夹共享的读写权限

 刚加入博客园。虽然以前也经常在园子里晃悠,但只记得欣赏大牛们的大作了,从来没灌过水。这算是我的处女贴,权当是给园子增加流量了。     毕业走出校门,找了份编程的差事。     刚一上岗,就接到项目...
  • floweronwarmbed
  • floweronwarmbed
  • 2008-11-06 15:41:00
  • 2370
收藏助手
不良信息举报
您举报文章:vc++汇总
举报原因:
原因补充:

(最多只允许输入30个字)