博文
一个MFC Extension DLL的Dialog例子(2009-02-09 13:39:00)
摘要:下面一个MFC Extension DLL的例子,及调用对话框资源文件失败解决方法
来源于:http://www.dotnetheaven.com/Uploadfile/mahesh/MFCExtensionDLL05192005030337AM/MFCExtensionDLL.aspx?ArticleID=d3bf0587-453d-4449-a524-89840fa12cf6
这是个老外写的例子,挺不错的,有学习的意义!特别要注意加粗字段,就是有时候问题所在!
Create Skeleton of the Dll
Use MFC AppWizard to create an extension dll's skeleton
Select MFC Extension Dll
Click Finish. As you see on this dialog, Main Source code in mcExtnDll.h and cpp
Adding Dialog Resource
Add a new dialog by using ResourceView. Add three edit controls, three static controls and two buttons. Now dialog should look like this:
Make sure to check Number style of all three edit controls.
Adding Dialog Class
Now Add a new class CmcDlg derived from CDialog by using Insert->New Class menu from your main menu. Make sure the Dialog ID is IDD_DIALOG1, your dialog's resource ID.
Now write click handler for Ad......
CString的GetBuffer(2009-02-07 20:41:00)
摘要:首先举个例子。
CString s( "abcd" );
int len=s.GetLength();
LPTSTR p = s.GetBuffer( 5 );
strcpy( p, "Hello" );
如果你需要修改 CString 中的内容,它有一个特殊的方法可以使用,那就是 GetBuffer,它的作用是返回一个可写的缓冲指针。
如果仅仅是读出CString中的内容,那么只需要用GetBuffer(0)即可。如果后面对CString还有其他操作,那么立刻ReleaseBuffer。
其他:
GetBuffer() 他會create出所指定大小的空間出來 這個空間是可以讓我們修改的
很多時候 有的 API 會要一個(char*)的指標作為輸出
如果我們就因為這樣去產生一個(char*)的buffer 給他 等到資料取出來之後
便無法使用CString 的種種方便功能
因此 比較好的做法 便是用GetBuffer()來產生一個buffer空間給他
等到取出來之後 我們便可以直接使用CString來對他操作
GetBuffer() 使用完後 最好是呼叫一下ReleaseBuffer()做為結束
雖然小弟的網誌之前已經有很多GetBuffer()的使用了 不過還是附個範例
CFile file;
// FILE_NAME 為事先定義好的檔案名稱
if(file.Open(FILE_NAME,CFile::modeRead))
{
CS......
分解CString(2009-02-07 17:31:00)
摘要:使用MFC进行编程,自然会用到CString,将几个CString、Char、Int、Float变量连接起来组成一个新的CString的方法大家肯定都很熟悉,自然是CString.Format。可是怎么进行逆操作呢?
下面来个case-study吧。
代码需求:一个长字符串Str0,其格式是“str1 str2 str3 str4...”(以“str1 str2 str3”为例),需要分解到对应的CString变量中。
一看到这个需求,大家肯定都心中有代码了,呵呵,先别急,看看有没有简便一些的做法。
sscanf(Str0, "%s %s %s", Str1.GetBuffer(), Str2.GetBuffer(), Str3.GetBuffer());
如何?是不是很easy?不过要注意做异常处理哦,呵呵
......
DrawText如何使多行文字居中(2009-02-03 17:24:00)
摘要:(1)DT_WORDBREAK
只能截断单词。例如如果输入一连串英文字符,那么它会当做一个单词来处理,而不会自动换行。而对于中文字符则可以。如果要对所有字符都可以像Edit控件中那样自动换行,那么可以使用DT_WORDBREAK | DT_EDITCONTROL
DT_EDITCONTROL
Duplicates the text-displaying characteristics of a multiline edit control. Specifically, the average character width is calculated in the same manner as for an edit control, and the function does not display a partially visible last line.
(2)DT_CALRECT的使用
对于一段text,要计算他的显示大小,那么可以使用DT_CALRECT标志。其中的rect参数属于IN/OUT类型。输出时,左上角坐标不变,右下角坐标改变。函数返回值是文本的高度。当然,它要与不同格式标志一起使用得到的结果是不一样的。例如,DT_CALRECT | DT_SINGLELINE 时,它只扩展传入rect的width,而在多行显示的时候,即DT_WORDBREAK | DT_WORDBREAK | DT_EDITCONTROL,仅仅扩展height,width不变。
DT_CALCRECT Determines the width and height of the rectangle. If there are multiple lines of text, DrawText will use the width of the rectangle pointed to by lpRect and extend the base of the rectangle to bound the last line of text. If there is only one line of text, DrawText will modify the right side of the r......
(转)巧借qq截图功能(2009-01-20 11:15:00)
摘要:昨天看到有一个朋友自己实现了类似QQ截图的功能,于是把QQ截图的 DLL 翻出来,简单测试了一下,发现一些不常见的小功能也许对大家有用。这里使用 RTX(腾讯的另一个软件产品) 中自带的 camerawnd.dll, 和QQ的很相似。
第一步:用 vc 自带的 DEPENDS.EXE 察看 DLL 的导出函数,有以下三个
CameraSubArea,CameraWndArea,CameraScreen
从字面意思看,第一个是截取子范围的,第二个是截取窗口范围的,第三个是截屏的现在还不知道函数参数,写个测试程序先,函数暂时认为无返回值 无参数代码如下:
typedef void (*FUN)();
HMODULE hInst = LoadLibrary(_T("CameraWnd.dll"));
if (hInst != NULL)
{
FUN pFunc = (FUN)GetProcAddress(hInst, "CameraSubArea");
if (pFunc != NULL)
{
pFunc();
......
(转)QQ 静态截图程序模拟实现(2009-01-20 11:10:00)
摘要:《QQ 静态截图程序模拟实现》
《QQ 静态截图完善实现之改造 CRectTracker 类》
参见VC知识库文章和源码
......
VC 如何保存GDI图形为BMP文件(2009-01-20 11:01:00)
摘要:一、要把文本和图形保存到位图文件,只要对掌握位图结构有一定的了解,一切都ok呢。先必须要创建内存设备环境,然后内存设备环境创建的DIB区域,别忘了还要创建个CBitmap对象,CBitmap对象必须和DIB区域关联起来,把CBitmap对象选择到当前设备环境,然后在当前设备环境输出文本和图形就可以了。
二、具体实现代码如下
void CTestSaveBmpView::SaveAsBmp(CString filename)
{
//定义图形大小
int iWidth = 800;
int iHeight = 600;
int iPixel = 16;
//图形格式参数
LPBITMAPINFO lpbmih = new BITMAPINFO;
lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbmih->bmiHeader.biWidth = iWidth;
lpbmih->bmiHeader.biHeight = iHeight;
lpbmih->bmiHeader.biPlanes = 1;
lpbmih->bmiHeader.biBitCount = iPixel;
lpbmih->bmiHeader.biCompression = BI_RGB;
lpbmih->bmiHeader.biSizeImage = 0;
lpbmih->bmiHeader.biXPelsPerMeter = 0;
lpbmih->bmiHeader.biYPelsPerMeter = 0;
lpbmih->bmiHeader.biClrUsed = 0;
lpbmih->bmiHeader.biClrImportant = 0;
//创建位图数据
HDC hdc,h......
位图文件读取基本信息(2007-09-27 23:26:00)
摘要:位图文件读取基本信息类下载
http://www.vckbase.com/document/viewdoc/?id=674......
VC中实现全屏(2007-09-27 00:08:00)
摘要:时间有限,贴个网址,我尝试成功了,写的很好!
http://dawningofchanges.blogchina.com/viewdiary.12816840.html......
VC中产生随机数(2007-03-26 12:39:00)
摘要:
需要的头文件:<stdlib.h>,<time.h>
库函数:srand;rand;time
方法:
1.首先设置种子srand(unsigned)time(NULL));使用当前时间作为种子是多数人的习惯做法.
2.产生随机数:rand()可以产生一个随机数;范围在0~RAND_MAX(32767)之间;如果要产生一个[min,max]之间的数,可以这样:rand()%(max-min) + min;
例子:产生10个[0,100] 之间的随机整数:
#include <stdlib.h>
#include <time.h>
#define ARRAY_SIZE 10
int adwSortArray[ARRAY_SIZE];
void init_sortarray()
{
srand((unsigned)time(NULL)); // 一般来说,设置一次种子即可
int wLoop;
printf("Before sort:\n");
for(wLoop = 0; wLoop < ARRAY_SIZE; wLoop++)
{
adwSortArray[wLoop] = rand()%100;
printf("%d\t",adwSortArray[wLoop]);
}
printf("\n");
return;
}
......