............
HRESULT hr;
IDispatch *pDisp = GetHtmlDocument();
IHTMLDocument2 *pDocument = NULL;
IHTMLElement* pEl;
IHTMLBodyElement * pBodyEl;
hr = pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument);
if(SUCCEEDED(pDocument->get_body(&pEl)))
{
if(SUCCEEDED(pEl->QueryInterface(IID_IHTMLBodyElement, (void**)&pBodyEl)))
{
pBodyEl->put_scroll(L"no");//去滚动条
}
IHTMLStyle *phtmlStyle;
pEl->get_style(&phtmlStyle);
if(phtmlStyle != NULL)
{
phtmlStyle->put_overflow(L"hidden");
phtmlStyle->put_border(L"none");// 去除边框
phtmlStyle->Release();
pEl->Release();
}
}
................
2011-08-03
未初始化的全局变量分配在binary的.bss段,只有占位符。只有系统启动这个程序时,才实际分配空间.
2011-08-11
UNICODE下CString转换成char*的方法
方法1: CString str = _T("测试用例");
int nLength = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);
char *pBuffer = new char[nLength + 1];
WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pBuffer,nLength,NULL,NULL);
pBuffer[nLength] = 0;
方法2:
CString s = _T("测试用例");
USES_CONVERSION;
char* lpsz = T2A(s.GetBuffer(s.GetLength()));
s.ReleaseBuffer(s.GetLength());
char*转UNICODE除了上述2种对应的方法外还可以用CString的Format("%s",lpsz);
2011-08-12
从CStatic派生类CDragStatic,在OnEraseBkGrnd里加载BMP位图,默认下不显示出来,响应OnPaint,并把CPaint dc();这句注释掉就可以了,以后再研究
2011-08-16
系统自定义的对话框比如颜色对话框CColorDialog,如果要在创建对话框时改变对话框的标题,可以派生一个对话框类,还有种简单的方法,代码如下:
CColorDialog dlg;
dlg.m_cc.Flags |= CC_ENABLEHOOK;
dlg.m_cc.lpfnHook = CdlgHook;UINT_PTR CALLBACK CdlgHook( HWND hdlg,UINT uiMsg,WPARAM /*wParam*/, LPARAM lParam)
{
if(uiMsg == WM_INITDIALOG)
{
CHOOSECOLOR *pcc = (CHOOSECOLOR*)lParam;
CRect *rc = (CRect*)pcc->lCustData;
if(rc)
SetWindowPos(hdlg,HWND_TOP,rc->right,rc->bottom,
0,0,SWP_NOZORDER|SWP_NOSIZE);
SetWindowText(hdlg, _T("Choose a Foreground Color"));
delete rc;
}
return 0;
}
2011-08-24
pop3收邮件,假定先收取第一封邮件,每次recv 1KB的数据,循环接受20次,即只接收了20KB的数据,如果第一封邮件有30KB,即使用命令retr 2 \r\n,收到的数据并不是第二封邮件的内容,而是第一封没有收完的数据。
2011-08-30
1:LoadImage加载资源后一定要释放,如果用GDI对象Attach到资源,不detach,当GDI对象析构时绑定的资源也释放,detach后则与资源无关了。
2:使用自绘控件,需要加载BMP图片,资源ID正确且有定义,但编译时一直提示IDB_BITMAP1为“未定义的标识”,原因1,没有#include"resource.h",原因2:没有清楚并
rebuilderall.
2011-08-31
vector:push_back 的时候,会导致 iterator 无效, 因为可能会复制内存(对内存的使用是翻倍,比如先new16字节,push_back不够就new32字节并把开始的16个字节复制过去), 因此,如果其它线程正在读取数据, 当前使用的iterator 就无效了
2011-09-01
1:解决在VS2005中“当前不会命中断点。源代码与原始版本不同”的问题:删除DEBUG目录和其他多余的文件,清除重新编译,如果还不行就找到有问题的文件,记事本打开用UNICODE另保存,再清除重新编译解决。
2:对话框去掉标题栏当做CDialogBar使用。在对话框中使用CDialogBar略显麻烦,需要借鉴CFrameWnd的一些实现,为了达到效果可用一个非模态的对话框来模拟,默认风格是POPUP,去掉标题栏的代码为(最通俗的最原始的方法):
LONG lStyle = ::GetWindowLong(GetSafeHwnd(), GWL_STYLE);
lStyle &= ~WS_CAPTION;
::SetWindowLong(GetSafeHwnd(), GWL_STYLE, lStyle);
使用时如果移动父窗口则“工具条不会移动”,解决方法可以相应父窗口的WM_SIZE,WM_MOVE。。等消息来MOVE这个工具条,如果把风格改为CHILD则标题栏又回来了。
解决方法:ModifyStyle(WS_CAPTION, NULL, SWP_DRAWFRAME );
2011-09-15
自定义消息,是不能跨进程发送的,要用RegisterWindowMessage注册消息才可以.
2011-09-29
遍历某个文件夹下的所有文件
find(char * lpPath)
{
char szFind[MAX_PATH];
WIN32_FIND_DATA FindFileData;
strcpy(szFind,lpPath);
strcat(szFind,"\\*.*");
HANDLE hFind=::FindFirstFile(szFind,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind) return;
while(TRUE)
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(FindFileData.cFileName[0]!='.')
{
strcpy(szFile,lpPath);
strcat(szFile,"\\");
strcat(szFile,FindFileData.cFileName);
find(szFile);
}
}
else
{
cout << FindFileData.cFileName;
}
if(!FindNextFile(hFind,&FindFileData)) break;
}
FindClose(hFind);
}
2011-11-1
Heap corruption detected error
char *pSrc = "fsfdfdg";
unsigned int tLength=strlen(pSrc);
char* pDest = new char[tLength];
memset(pDest,0,tLength);
strcpy(pDest,pSrc);
delete []pDest;
运行后会出现Heap Corruption detected,意思是说写数据的字节数超过了分配的字节数,比如分配了10个字节,但是从分配返回的指针开始写了11个字节的数据 ,strcpy最后会拷贝个\0,越界读写数据。分配的数据大小应该改为tLength+1
柔性数组
struct test
{
int a;
double b;
char c[0];
};
char sz[] = “hello world”;
struct test *PntTest = ( struct test* )malloc( sizeof( struct test ) + strlen( sz ) + 1 );
strcpy( PntTest + 1,sz );
c就叫柔性数组成员,如果把PntTest指向的动态分配内存看作一个整体,c就是一个长度可以动态变化的结构体成员,柔性一词来源于此。c的长度为0,因此它不占用test的空间,同时PntTest->c就是“hello world”的首地址,不需要再使用( char* )( PntTest + 1 )这么丑陋的语法了。
2011-11-09
复制构造函数,临时对象,编译器的优化
class A
{
public:
explict A(int a){}
A(A&a){}
};
A obj(A(0));
编译器一般会采取优化,直接用A(0)去构造obj
也就是在编译器优化时
A obj(A(0));
被优化为:A obj(0);
编译器在处理涉及到因为被拷贝构造函数引起的临时对象时才会优化掉拷贝构造函数的调用
如果拷贝构造函数的调用就不成功的话就谈不上优化了,只会是一个编译错误,因为临时对象不能绑定到非const引用上面
2011-11-21
CTreeCtrl提供了一些对多选的支持,但是不象ListBox那么容易实现。如果你使用 TVM_SELECTITEM来选择CTreeCtrl的条目的话,只能选择一个。但你可以利用TVM_SETITEM来修改每个CTreeCtrl条目的 TVIS_SELECTED属性,它决定每个条目的选种、中状态。TVM_SELECTITEM实际上同时修改LVIS_FOCUSED和 TVIS_SELECTED属性。具有LVIS_FOCUSED 属性的条目同时只能有一个,而具有TVIS_SELECTED属性的可以同时有多个。Windows在处理TreeView鼠标点击时,它会清除先前具有 焦点的条目的LVIS_FOCUSED属性,但不会清除其他项的TVIS_SELECTED属性。为了实现多选功能,你还需要处理 WM_LBUTTONDOWN消息,以避免Windows清除当前有输入焦点的条目的TVIS_SELECTED属性。这就是实现多选的基本原理。
2011-12-06
OCP(Open-Closed Principle开闭原则)这个原则的意思大概是说:软件对扩展应该是开发的,对修改应该是关闭的。说的更通俗点儿,就是说我们开发了一个软件,应该可以对它进行功能扩展(开放),而在进行这些扩展的时候,不需要对原来的程序进行修改(关闭)
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充
2011-12-21
去掉webbrowse控件的边框和滚动条
2012-01-10
如何让窗口上某个控件置顶:注意设置这个控件的父窗口,Windows会把一个控件显示在它的父控件之前。
2012-02-08
HHOOK hMsgBoxHook=NULL;
LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
HWND hwnd, hndx;
if(nCode < 0)
return CallNextHookEx(hMsgBoxHook, nCode, wParam, lParam);
switch(nCode)
{
case HCBT_ACTIVATE:
// 现在wParam中就是message box的句柄
hwnd = (HWND)wParam;
// 有了message box的句柄,定制message box
hndx = GetWindow(hwnd, GW_CHILD);
::SetWindowText(hndx, _T("OK11") );
HWND hWnd = ::GetNextWindow(hndx,GW_HWNDNEXT);
::SetWindowText(hWnd, _T("NO") );
//SetWindowLong(hwnd,DWL_DLGPROC,(LONG)AboutDlgProc);
return 0;
}
return CallNextHookEx(hMsgBoxHook, nCode, wParam, lParam);
}
int MsgBoxEx(HWND hwnd, TCHAR *szText, TCHAR *szCaption, UINT uType)
{
int ret;
hMsgBoxHook= SetWindowsHookEx(
WH_CBT,
CBTProc,
NULL,
GetCurrentThreadId()
);
ret = ::MessageBox(hwnd, szText, szCaption, uType);
UnhookWindowsHookEx(hMsgBoxHook);
hMsgBoxHook = NULL;
return ret;
}
修改MessageBox上按钮标题
2012-02-20
关于CString::GetLength,对于UNICODE,结果是字符数,对于ASCII,结果是字节数
2012-02-21
2个线程同时用fopen_s,"a"打开写文件,返回13