??xml version="1.0" encoding="utf-8" standalone="yes"?>久久综合亚洲色HEZYO社区,蜜臀久久99精品久久久久久,精品久久久久香蕉网http://www.shnenglu.com/szhoftuncun/category/5154.htmlQQ一P35660860
QQ二P40790936
癑ֺHi:1131729
上帝要你dq求完美的道路上zh-cnTue, 20 Jan 2009 16:59:53 GMTTue, 20 Jan 2009 16:59:53 GMT60- 关于文字输出的函数TabbedTextOut[整理]http://www.shnenglu.com/szhoftuncun/archive/2009/01/20/72382.html沈臻?foxtail)沈臻?foxtail)Tue, 20 Jan 2009 09:14:00 GMThttp://www.shnenglu.com/szhoftuncun/archive/2009/01/20/72382.htmlhttp://www.shnenglu.com/szhoftuncun/comments/72382.htmlhttp://www.shnenglu.com/szhoftuncun/archive/2009/01/20/72382.html#Feedback0http://www.shnenglu.com/szhoftuncun/comments/commentRss/72382.htmlhttp://www.shnenglu.com/szhoftuncun/services/trackbacks/72382.html关于文本的输?/strong>
在如何自q写文本控件时Q有关于如何展开Tab的具体做法:
1
void TextView::PaintLine(HDC hdc,int line_no)
2
3

{
4
5
int length = document->GetLineLength(line_no + start_line_no);
6
7
char *buffer = new char[length];
8
9
document->GetLineBuffer(buffer,line_no + start_line_no);
10
11
//容纳单行文本矩Ş区域
12
13
RECT line_rect;
14
15
GetClientRect(tv_hwnd,&line_rect);
16
17
line_rect.top = line_no*(font_height + font_extra);
18
19
line_rect.bottom = line_rect.top + font_height + font_extra;
20
21
line_rect.left -= start_column_no*5;
22
23
//展开Tab字符
24
25
int tab = 4*font_width;
26
27
int width = TabbedTextOut(hdc,line_rect.left,line_rect.top,buffer,length,1,&tab,line_rect.left);//输出文字
28
29
line_rect.left = LOWORD(width);
30
31
ExtTextOut(hdc,0,0,ETO_OPAQUE,&line_rect,0,0,0);
32
33
delete []buffer;
34
35
}
36
要明白他的意思才能在以后的编写扩展功能才能得心应手。首先要明白一个函数?/span>
TabbedTextOut
功能Q?/span>
1一个字W串写到指定位置?/span>
2q按制表位位|数l?/span>里的值展开制表W?/span>?/span>
函数原型Q?/span>
LONG TabbedTextOut(HDC hdc, int X, int Y, LPCTSTR lpString, int nCount, int nTabPositions, LPINT lpn TabStopPositions, int nTabOrigin)
参数意义Q?/span>
Hdc Q设备环境句柄?/span>
XQ?/span> 字符串开始点?/span>x坐标Q逻辑单位Q?/span>
YQ?/span> 字符串开始点?/span>y坐标Q逻辑单位Q?/span>
lpStringQ缓冲区指针?/span>
nCountQ?/span> 字符数?/span>
nTabPositionsQ指定制表位位置数组的值的个数?/span>
lpnTabStopPositionsQ数l,包含制表位位|(逻辑单位Q。必L照升序保存?/span>
nTabOriginQ指定制表符展开的开始位|的x坐标Q逻辑单位Q?/span>
q回|字符串的寸Q高位字表示高度Q低位表C宽度?/span>
注:
??span style="FONT: 7pt 'Times New Roman'"> 如果nTabPositionsgؓ0Q且lpnTabStopPositionsgNULLQ那么制表符会按q_字符宽度?/span>8位来扩展?/span>
??span style="FONT: 7pt 'Times New Roman'"> 如果lpnTabStopPositions数组包含一个以上的话,则制表位被设为数l里的每一个|׃ؓlpnTabStopPositions个?/span>
??span style="FONT: 7pt 'Times New Roman'"> nTabOrigin参数允许一个应用程序ؓ一行多ơ调?/span>TabbedTextOut。如果应用程序多ơ调?/span>TabbedTextOutQ?/span>nTabOrigin每次都设|相同的|则此函数在相对于nTabOrigin指定的位|处展开所有的制表W?/span>
知识补充Q?/span>
TabbedTextOut(hdc,line_rect.left,line_rect.top,buffer,length,1,&tab,line_rect.left);
W六个参CؓnTabPosition = 1
W七个参CؓlpnTabStopPositions = tab = 4*font_width
W八个参CnTabOrigin = line_rect.left
因ؓ~辑器以行位模型Q当然是从一行的最左端开始。制表位数组g个等于字体宽度的4倍?/span>
摘自?/span>windows~程》的解释Q?/span>
TabbedTextOut的前五个参数?/span>TextOut相同Q第六个参数是蟩位间隔数Q第七个是以囄为单位的跳位间隔数组?/span>
?/span>1?/span> 如果q_字符宽度?/span>8个图素,而您希望?/span>5个字W加一个蟩位间隔,则这个数l将包含40?/span>80?/span>120Q按递增序依此cL?/span>
??span style="FONT: 7pt 'Times New Roman'"> 如果W六个和W七个参数是0?/span>NULLQ则跳位间隔按每八个q_字符宽度讑֮?/span>
??span style="FONT: 7pt 'Times New Roman'"> 如果W六个参数是1Q则W七个参数指向一个整敎ͼ表示跳位间隔重复增大的倍数Q例如,如果W六个参数是1Qƈ且第七个参数指向gؓ30的变量,则蟩位间隔设定在30?/span>60?/span>90…囄处)。最后一个参数给Z从蟩位间隔开始测量的逻辑x坐标Q它与字W串的v始位|可能相同也可能不同?/span>
~辑器的展开tab属于?/span>3】,增大倍数?/span>4个字W宽度?/span>4倍与8倍的区别如图Q?/span>

|

|

]]>- 俄罗斯方块V1.2http://www.shnenglu.com/szhoftuncun/archive/2008/11/16/67025.html沈臻?foxtail)沈臻?foxtail)Sat, 15 Nov 2008 16:22:00 GMThttp://www.shnenglu.com/szhoftuncun/archive/2008/11/16/67025.htmlhttp://www.shnenglu.com/szhoftuncun/comments/67025.htmlhttp://www.shnenglu.com/szhoftuncun/archive/2008/11/16/67025.html#Feedback2http://www.shnenglu.com/szhoftuncun/comments/commentRss/67025.htmlhttp://www.shnenglu.com/szhoftuncun/services/trackbacks/67025.htmll箋上个版本修改了一?/span>bugQ然后美化了一下?/span>
发现自己的审观不咋的,得漂亮的人家觉得不漂亮。还是照着大家要求的画一个?/span>
主要解决的问题是Q这ơ行列都用宏表示Q这样可以修改行列,H口大小也动态改变?/span>
另外长条旋{变成Z型问题也解决Q主要是取模的时候绕回去了?/span>
其中最重要的要是解决了刷新闪烁问题,管HAM2008指点q,始终没做成,q次vczh说了一句话q醒了我。根本不应该使用InvalidateRect函数Q直接画Q然后用~冲DC可以了?br>
VOID OnPaint()


{
HDC hdc = GetDC(hWnd);
HDC bitmap_dc = CreateCompatibleDC(hdc);
HBITMAP bitmap = CreateCompatibleBitmap(hdc,1024,768);
SelectObject(bitmap_dc,bitmap);

/**//********************************************
DrawBlock
*********************************************/
int x = tetris.GetX();
int y = tetris.GetY();

for(int i=0; i<4; ++i)

{
for(int j=0; j<4; ++j)

{
if(current_block[i][j] == 1)

{
DrawBlock(bitmap_dc,y+i+1,x+j+1,3,3,tetris.GetColor(),RGB(0,0,0));
}
}
}


/**//*****************************************
*DrawContainer
******************************************/
for(int i=0; i<ROWS; ++i)

{
for(int j=0; j<COLS; ++j)

{
if(Container[i][j] == 1)

{
DrawBlock(bitmap_dc,i+1,j+1,3,3,ColorTable[i][j],RGB(0,0,0));
}
}
}

BitBlt(hdc,0,0,1024,768,bitmap_dc,0,0,SRCCOPY);
DeleteDC(bitmap_dc);
DeleteObject(bitmap);
ReleaseDC(hWnd,hdc);
}
以上是GDI~冲的主要实C码?br>
可执行文件下?/a>
代码q是{全部完善后上传吧。Redist误行下载?/span>
代码估计要有大的改动Q感觉现在的代码没一点C++的味道?br>有点单,用陈坤的话说是扩展性不好?

]]> - 俄罗斯方块V1.0http://www.shnenglu.com/szhoftuncun/archive/2008/11/09/66377.html沈臻?foxtail)沈臻?foxtail)Sat, 08 Nov 2008 16:06:00 GMThttp://www.shnenglu.com/szhoftuncun/archive/2008/11/09/66377.htmlhttp://www.shnenglu.com/szhoftuncun/comments/66377.htmlhttp://www.shnenglu.com/szhoftuncun/archive/2008/11/09/66377.html#Feedback2http://www.shnenglu.com/szhoftuncun/comments/commentRss/66377.htmlhttp://www.shnenglu.com/szhoftuncun/services/trackbacks/66377.html记得8月䆾写过俄罗斯方块,那会全是用坐标表C的。包括所有方块的变换Q甚x块的表示。导致程序内部许多的case语句Q甚为麻烦。代码量也有q?/span>1800行左叟뀂而且写完?/span>bug很多Q修正也修正不完Q异常头痛便攑ּ了?/span>
现在看看《编E之》的俄罗斯方块的思\Q又惌vvczh用脚本的写的俄罗斯方块,又起了兴趣。便重新设计完成了,q次基本没什?/span>bug了。只不过操作习惯上和QQ的俄|斯方块q有些不同?/span>
1. 在底部的时候,如果按住旋{不放Q则会停留原地旋转。原因是Z接触底部时旋{不插入墙壁,同接触左右墙壁一P做了调整方块坐标处理。处理方法是Ҏ旋{后方块的坐标加上Q减去)最大列(最列)在减去(左)双界得到。底部也是这栯的。当然有了这L便出现了这L小?/span>bugQ不q我怿没h会在底部按住不放的?/span>
2. q次方块全部存储在一个一l数l中Q通过指针的变换来改变方块U类与旋转状态,但是Z方便操作Q就拯C一个二l数l中。v初设计是一个四l数l,q样方便多了,但是VS2008的编译器却不能编译通过Q?/span>int[4][4]?/span>int **p的{换不成功Q朋友说是编译器问题。后来经Lend3d_很多目都是不用大于二维的数l的Q于是干脆就用了一l数l,本来要听从他意见用结构表CZ个低二位的数l元素,但是初始化和使用都不是很方便?/span>
3. 另外关于GDI~冲Q试用了一下,但是作用貌似不大Q不知道原因。关于这斚w的知识援助还是要感谢HAM2008的帮助?br>
贴个头文件出来就可以知道大致做法了?br>
#ifndef TETRIS_H
#define TETRIS_H

#pragma once

extern int Container[18][10];//容纳方块的空?/span>
extern int current_block[4][4];


/**//****************************
* 方块的主要行?br>
*****************************/
class Tetris


{
public:
Tetris();
~Tetris();
void GenerateBlock();
void StepLeft();
void StepRight();
void StepDown();
void Rotate();
void CaculateScore();
void IsOver();
public:
bool lost;
int score;//得分
int GetX();
int GetY();
private:
inline int CaculateMinCol();
inline int CaculateMinRow();
inline int CaculateMaxCol();
inline int CaculateMaxRow();

void CaculateBlockBoundary();
bool DetectCollision();
void CopyToContainer();
void CopyToBlock();

int *block;
int total_rotate;
int kind;

int offset_x;
int offset_y;

int min_col,max_col;
int min_row,max_row;
};

#endif //TETRIS_H
可能自己设计上的能力q是不吧,有些函数是不得以写的Q比如四个inline函数Q因的时候用的是四个循环Q计完p跛_两层循环?br>N用gotoQ如果直接return则后面的代码执行不到了,不得以做了四个辅助函数?br>
源代码下载:TetrisV1.0
可执行文件下载:TetrisV1.0.exe 如果不能q行可到微Y下蝲VS2008?redist_x86

]]> - 文gMD5计算工具http://www.shnenglu.com/szhoftuncun/archive/2008/10/26/65052.html沈臻?foxtail)沈臻?foxtail)Sat, 25 Oct 2008 17:50:00 GMThttp://www.shnenglu.com/szhoftuncun/archive/2008/10/26/65052.htmlhttp://www.shnenglu.com/szhoftuncun/comments/65052.htmlhttp://www.shnenglu.com/szhoftuncun/archive/2008/10/26/65052.html#Feedback0http://www.shnenglu.com/szhoftuncun/comments/commentRss/65052.htmlhttp://www.shnenglu.com/szhoftuncun/services/trackbacks/65052.htmlC++博客上的蚂蚁l结者的文章都写的不错,它写了个MD5的算法,我就用他的算法写了个程序?br>单的计算文g的MD5Q支持拖拽文件。现在还只是单的计算?br>目前打算改进的是
1dq度条?br>2化界面?br>3解决大文件计时界面僉|问题?br>
个h写程序喜Ƣ不断改q,也就是偶然突发奇惛_个程序。以后想h改q一下。嘎嘎?br>要是忘记了,׃|。代码可点击q里下蝲

]]> - ClipBoard.ASM文g分析http://www.shnenglu.com/szhoftuncun/archive/2008/10/03/63189.html沈臻?foxtail)沈臻?foxtail)Fri, 03 Oct 2008 08:27:00 GMThttp://www.shnenglu.com/szhoftuncun/archive/2008/10/03/63189.htmlhttp://www.shnenglu.com/szhoftuncun/comments/63189.htmlhttp://www.shnenglu.com/szhoftuncun/archive/2008/10/03/63189.html#Feedback1http://www.shnenglu.com/szhoftuncun/comments/commentRss/63189.htmlhttp://www.shnenglu.com/szhoftuncun/services/trackbacks/63189.html脑袋里没有点API的储量,惛_什么东西还是很困难的。厚U薄发才是硬道理。所以先看看别h的代码,偷学几个API的用法?/p>
SetClipData proc lpData:LPSTR,dwSize:dword
LOCAL hMem:HANDLE ;==>内存块句?br>
LOCAL pMem:dword ;==>内存块指?br>
mov eax,dwSize
shr eax,3
inc eax
shl eax,3 ;==>(dwSize/8 + 1)*8 不满8的倍数则补?br>
invoke xGlobalAlloc, GHND or GMEM_DDESHARE, eax
test eax,eax ;==>甌成功则l否则蟩转到@exit2
je @exit2
mov hMem,eax
invoke GlobalLock,eax ;hGlob ;==>锁定甌的内存块q回内存块指?br>
test eax,eax
je @exit1
mov pMem,eax
invoke RtlMoveMemory,eax,lpData,dwSize ;==>复制lpData的内容到甌的内存块?br>
mov eax,pMem
add eax,dwSize
mov byte ptr [eax],0 ;==>在内存块最后添0l束
invoke GlobalUnlock,hMem ;==>解锁Q内存块指针无?br>
invoke OpenClipboard,NULL
.if eax
invoke EmptyClipboard
invoke SetClipboardData,CF_TEXT,hMem ;==>数据关联到剪脓?br>
invoke CloseClipboard
xor eax,eax ;0 - Ok
jmp @exit3
.endif
@exit1:
invoke GlobalFree, hMem ;==>未锁定成功则释放该内存块
xor eax, eax
@exit2:
dec eax ; -1 - error
@exit3:
ret

SetClipData endp
看完q段代码我有一个疑问,q里是将lpData的数据拷贝到一个内存块Q然后与剪脓板关联,我这里解释ؓ兌Q我p为剪贴板不应该是一个内存区域,我猜是一个链表之cȝl构Q然后链表每一个节点存储一个内存区域的指针q有其他的信息,然后Ҏ信息来管理?/span>
否则应该可以直接?/span>lpData来跟剪脓板关联。另一个原因是lpData是局部的随时会被释放的。如有不正确q望指正?/span>

]]> - [zt]关于DLL的创建和使用http://www.shnenglu.com/szhoftuncun/archive/2008/10/02/63170.html沈臻?foxtail)沈臻?foxtail)Thu, 02 Oct 2008 15:19:00 GMThttp://www.shnenglu.com/szhoftuncun/archive/2008/10/02/63170.htmlhttp://www.shnenglu.com/szhoftuncun/comments/63170.htmlhttp://www.shnenglu.com/szhoftuncun/archive/2008/10/02/63170.html#Feedback0http://www.shnenglu.com/szhoftuncun/comments/commentRss/63170.htmlhttp://www.shnenglu.com/szhoftuncun/services/trackbacks/63170.html (1)Windows的系l目录:\windows\systemQ?br> (2)DOS中path所指出的Q何目录;
(3)E序所在的目录?br> 一、动态链接库的结?br>
动态链接库中定义有两种函数Q导出函?export function)和内部函?internal function)Q?br>导出函数可以被其它模块调用,内部函数只能在库内部使用。我们在用CQ+定制动态库文gӞ
需要编写的是包含导出函数表的模块定义文g(.DEF)和实现导出函数功能的CQ+文g。下面以
Sample.dllZ介绍DEF文g和实现文件的l构?br> 1.模块定义文g(.DEF)是一个或多个用于描述DLL属性的模块语句l成的文本文Ӟ每个DEF?br>件至必d含以下模块定义语句:
·W一个语句必LLIBRARY语句Q指出DLL的名字;
·EXPORTS语句列出被导出函数的名字Q?br> ·可以使用DESCRIPTION语句描述DLL的用?此句可?Q?br> ·"Q?对一行进行注?可??br> 2.实现文g
实现入口表函数的cpp文g中,包含DLL入口点处理的API函数和导出函数的代码?br> 二、创建Sample.dll
1.首先创徏Sample.dll的工E?启动VCQ+5.0按以下步骤生成DLL工程:
·在选单中选择File\New\ProjectQ?br> ·在工E列表中选择Win32 DynamicQLink LibraryQ?br> ·在Project Name中输入工E名:SampleQ?br> ·单击Location双按钮,选择c:\sample目录Q?br> ·单击OK完成,x已创ZSample.dll的工E文件?br> 2.创徏Sample.def文gQ?br> ·在选单中选择File\New\Text FileQ?br> ·输入以下代码后保存文件名"Sample.def"Q?br> ;Sample.def
;指出DLL的名字Sample,链接器将q个名字攑ֈDLL导入库中
LIBRARY Sample
;定义导出函数ShowMe()Z
EXPORTS
ShowMe
;def文gl束
3.创徏Sample.cpp
.在选单中选择File\New\CQ+ Source File?br> .输入以下代码后保存文件名"Sample.cpp"
//Sample.cpp
#include 〈windows.h?br> int ShowMe(void);
//DllEntryPoint为DLL入口点函?负责初试化ƈl止DLL
BOOL WINAPI DllEntryPoint(HINSTANCE hDLL,DWORD dwReason,LPVOID Reserved)
{ switch(dwReason)
{ case DLL-PROCESS-ATTACH:
{ break; }
case DLLQPROCESSQDETACH:
{ break; } }
return TRUE; }
int ShowMe(void)
{ //蜂鸣器响一?br> MessageBeep((WORD)Q?);
MessageBox("你好!");
return 1; }
4.~译DLL文g
从Build选单中选择Build Sample.DLL,产生Sample.DLL文g,以后可以随时调用了?br> 三、在应用E序中调用DLL文g
在应用程序中要首先装入DLL后才能调用导中的函数,例如用MFC创徏Z对话框的?br>ETest,q在对话框上攄"Load"按钮,你就必须d装蝲代码?br> 1.首先在TestDlg.cpp的首部添加变量设|代码:
//讄全局变量gLibSample用于存储DLL句柄
HINSTANCE gLibSample=NULL;
//W二个变量ShowMe是指向DLL库中ShowMe()函数的指?br> typedef int(?SHOWME)(void);
SHOWME ShowMe;
2.利用ClassWizard?Load"按钮d装蝲DLL的代码:
Void CTestDlg::OnLoadButton()
{ //要添加的代码如下
if(gLibMyDLL!=NULL)
{ MessageBox("The Sample.DLL has already been load.");
return; }
//装蝲Sample.dllQ未加\径,在三个默认路径中寻?br> gLibSample=LoadLibrary("SAMPLE.DLL");
//q回DLL中ShowMe()函数的地址
ShowMe=(SHOWME)GetProcAddress(gLibSample,"ShowMe"); }
3.只要DLL装蝲成功,在应用程序中可以直接调用ShowMe()函数Q本E序在Windows 95,VCQ+5.0中运行通过Q?

]]> - 如何自己写Win32控ghttp://www.shnenglu.com/szhoftuncun/archive/2008/08/20/59470.html沈臻?foxtail)沈臻?foxtail)Wed, 20 Aug 2008 14:06:00 GMThttp://www.shnenglu.com/szhoftuncun/archive/2008/08/20/59470.htmlhttp://www.shnenglu.com/szhoftuncun/comments/59470.htmlhttp://www.shnenglu.com/szhoftuncun/archive/2008/08/20/59470.html#Feedback0http://www.shnenglu.com/szhoftuncun/comments/commentRss/59470.htmlhttp://www.shnenglu.com/szhoftuncun/services/trackbacks/59470.html最早时候就曄哪里看到q说所有控仉是窗口(windowQ,更有甚者说都是对象Q这个就不扯了。自己做好的控g是做?/span>Libq是Dll那是后话Q?/span>MFC我是不熟悉了Q?/span>Win32q是看了几天的。大致把制作的整个流E简要的记录一下?/span>
自己做的控g最主要的功能就是接受你发给他的命oQ也是要给外部调用的接口。控件有自己的消息处理函数比?/span>
LRESULT CALLBACK PETextViewWndProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam)


{
PETextView *View = (PETextView*)GetWindowLong(hWnd,0);

switch(Message)

{
case WM_NCCREATE:
if((View = new PETextView(hWnd)) == 0)
return false;

SetWindowLong(hWnd,0,(LONG)View);
return true;

case WM_NCDESTROY:
if(View)delete View;
return 0;

case WM_PAINT:
return View->OnPaint();

case WM_SIZE:
return View->OnSize(wParam, LOWORD(lParam), HIWORD(lParam));

case PEM_OPENFILE:
return View->OpenFile((TCHAR*)lParam);

case PEM_CLEAR:
return View->ClearFile();
default:
break;
}

return DefWindowProc(hWnd,Message,wParam,lParam);
}

q里有两cL息,一cLpȝ定义的以WM开_一cL自己定义的,当然随便你自己定义啦。对应的消息看到是调用相应的函数完成的,q也是说控件的行ؓ可以另外编写逻辑部分Q然后提供接口给q里调用卛_?/span>
之所以说控g是H口是因Z有自qH口c,以及初始化函敎ͼ同时也有创徏的函数。窗口类的定义和注册也做成提供给外部的接口,在外部必要的时候调用。而控制控件是通过发送消息来实现的,Z更加好看Q可以定义一个宏Q比?/span>
#define PE_OpenFile(hWnd, Path) SendMessage((hWnd), PEM_OPENFILE, 0, (LPARAM)(Path))
那么创徏H口和控件唯一不同的地方就是,内部的创建和销毁消息是WM_NCCREATE?/span>WM_NCDESTROYQ先不管q两个消息。我们看?/span>WM_NCCREATE之前有个GetWindowLongQ其内有?/span>SetWindowLong。这两个是关键的Q这样就讄了这个控件的属性,使其兌hQ第二个参数msdn上是没有说明讄?/span>0是什么意思的Q其实这两个函数的第二个参数讄0表示d的意思,W一个是d该控件的属性,然后W二个函数在增加W三个参数的属性的同时d赋予l这个控件?/span>
一切都OK了!那么控g创徏可在外部?/span>WM_CREATE之时调用Q当然也可以在用其功能前调用即可?/span>
一切提供给外部的调用都Port在一个头文g中,q样使用的时候包含这个头文g好了?/span>
接下来解释那两个消息Q这两个消息是因为我们创Z子窗口,也就是我们自q控g?/span>
q两个消息与WM_CREATE,WM_DESTROY之间的顺序关pLq样的,只看销毁吧?/span>
hwnd = parent, uMsg = WM_DESTROY
hwnd = child, uMsg = WM_DESTROY
hwnd = child, uMsg = WM_NCDESTROY
hwnd = parent, uMsg = WM_NCDESTROY
WM_DESTROY是通知子窗口销毁,然后子窗口通过接受WM_NCDESTROYq行销毁,q发送给父窗口,q行销毁?/span>
l节部分介绍的差不多QM思\是和创建窗口差不多Q但是要搞个头文Ӟ把一些个帔R和功能的函数另外一个窗口类的初始化和创建的接口搞进厅R?/span>

]]> - [Z]Visual C++开发工具与调试技巧整?/title>http://www.shnenglu.com/szhoftuncun/archive/2008/07/29/57460.html沈臻?foxtail)沈臻?foxtail)Tue, 29 Jul 2008 12:05:00 GMThttp://www.shnenglu.com/szhoftuncun/archive/2008/07/29/57460.htmlhttp://www.shnenglu.com/szhoftuncun/comments/57460.htmlhttp://www.shnenglu.com/szhoftuncun/archive/2008/07/29/57460.html#Feedback0http://www.shnenglu.com/szhoftuncun/comments/commentRss/57460.htmlhttp://www.shnenglu.com/szhoftuncun/services/trackbacks/57460.htmlAzure博客
自己L用VCq_来开发东西,但是有时候L样那L问题Q呵呵,L需要上|查资料来解?在这里把自己用到上网查的一些技巧摘录如?希望对大家有用,省去大家再去搜烦的烦恹{?br>
1.如何在Release状态下q行调试
ProjectQ?gt;SettingQ?gt;ProjectSetting对话框,选择Release状态。C/C++标签中的Category选GeneralQOptimizations选Disable(Debug)QDebut info选Program Database。在Link标签中选中Generate debug info复选框?br>
注:只是一个介乎Debug和Release的中间状态,所有的ASSERT、VERIFY都不起作用,函数调用方式已经是真正的调用Q而不查表Q但是这U状态下QuickWatch、调用队列跟t功能仍然有效,和Debug版一栗?br>
2. Release和Debug有什么不?/strong>
Release版称为发行版QDebug版称试版?br>Debug中可以单步执行、跟t等功能Q但生成的可执行文g比较大,代码q行速度较慢。Release版运行速度较快Q可执行文g较小Q但在其~译条g下无法执行调试功能?br>Release的exe文g链接的是标准的MFC DLL(Use MFC in a shared or static dll)。这些DLL在安装Windows的时候,已经配置Q所以这些程序能够在没有安装Visual C++ 6.0的机器上q行。而Debug版本的exe链接了调试版本的MFC DLL文gQ在没有安装Visual C++6.0的机器上不能q行Q因为缺相应的DLLQ除非选择use static dll when link?br>
3. ASSERT和VERIFY有什么区?/strong>
ASSERT里面的内容在Release版本中不~译QVERIFY里面的内容仍然翻译,但不再判断真假。所以后者更安全一炏V?br>例如ASSERT(file.Open(strFileName))?br>一旦到了Release版本中,q一行就忽略了,fileҎ׃Open()了,而且没有M出错的信息。如果用VERIFY()׃会有q个问题?br>
4.Workspace和Project之间是什么样的关p?/strong>
每个Workspace可以包括几个projectQ但只有一个处于Active状态,各个project之间可以有依赖关p,在project的Setting..中可以设定,比如那个Active状态的project可以依赖于其他的提供其函数调用的静态库?br>
5. 如何在非MFCE序中用ClassWizard
在工E目录下新徏一个空?RC文gQ然后加入到工程中就可以了?br>
6.如何讄断点
按F9在当前光标处增加一个断点和取消一个断炏V?br>另外Q在~辑状态下Q按Ctrl+Bl合键,弹出断点讄对话框。然后单凅RCondition…】按钮弹|断Ҏ件的对话框进行设|?br>
7.在编辑状态下发现成员变量或函C能显C提C是如何打开昄功能
q似乎是目前q个Visual C++ 6.0版本的一个bugQ可按如下步骤其正常,如再出现Q可如法炮制Q?br>(1)关闭Project
(2)删除“工程?ncb”文g
(3)重新打开工程
8.如何一个通过ClassWizard生成的类d删除
首先在工作区的FileView中选中该类?h?cpp文gQ按delete删除Q然后在文g理器中这两个文g删除Q再q行ClassWizardQ这时出现是否移走该cȝ提示Q选择remove可以了?br>
9. 如何在workspace中消qcL出来
打开该类对应的头文gQ然后将其类名随便改一下,q个时候工作区׃出现新的c,再将q个cL回原来的名字可以了?br>
10. 如何清除所有的断点
菜单【Edit】->【Breakpoints…】,打开“Breakpoints”对话框,单击【Remove All】按钮即可。快捷键?#8220;Ctrl + Shift + F8”?br>
11. 如何再ClassWizard中选择未列出的信息
打开“ClassWizard”对话框,然后切换?#8220;Class Info”面。改?#8220;Message filter”Q如选择“Window”Q?#8220;Message”面׃出现Window的信息?br>
12. 如何程序中的括h否匹?/strong>
把光标移动到需要检的括号前面Q按快捷?#8220;Ctrl + ]”。如果括号匹配正,光标p到匹配的括号处,否则光标不移动,q且机箱喇叭q会发出一声警告?br>
13. 如何查看一个宏(或变量、函?的定?/strong>
把光标移动到要查看的一个宏上,比如说最常见的DECLARE_MAP_MESSAGE上按一下F12(或右键菜单中的相兌?Q如果没有徏立浏览文Ӟ׃出现提示对话框,按【确定】按钮,然后׃跛_该宏(或变量、函?定义的地斏V?br>
14. 如何dLib文g到当前工E?/strong>
单击菜单【Project】->【Settings…】弹?#8220;Project Setting”对话框,切换?#8220;Link”标签,?#8220;Object/library modules”处输入Lib文g名称Q不同的Lib之间用空格格开?br>
15. 如何快速删除项目下的Debug文g夹中临时文g
在工作区的FileView视图中选中对应的项目,单击右键弹出菜单Q选择【Clean(selection only)】菜单即可?br>
16. 如何快速生成一个现有工E除了工E名外完全相同的新工E?/strong>
在新建工E的“New”对话框中选择“Custom Appwizard”,输入新工E的名字Q单凅ROK】按钮。出?#8220;Custom AppWizard”,输入新工E的名字Q单凅ROK】按钮。出?#8220;Custom AppWizardQStep 1 of 2”对话框,选择“An existing Project”,单击【Next】按钮。出?#8220;Custom AppWizardQStep 2 of 2”对话框,选择现有工程的工E文件名Q最后单凅RFinish】按钮。编译后q成一个与现有工程相同但可以重新取名的工程AppWizard?br>现在可以项用MFC AppWizard一Lq个定制的向对{如果不想用了,可以在Visual C++ 6.0安装目录下Common\MSDev98\Template目录中删除该Wizard对应?awx?pdb文g?br>
17. 如何解决Visual C++ 6.0不正连接的问题
情景Q明明改动了一个文Ӟ却要把整个项目全部重新编译链接一ơ。刚刚链接好Q一q行Q又提示重新~译链接一ơ?br>q是因ؓ出现了未来文?修改旉和创建时间比pȝ旉?的缘故。可以这样处理:扑ֈ工程文g夹下的debug目录Q将创徏和修Ҏ间都比系l时间的文g全部删除Q然后再从新“Rebuild All”一ơ?br>
18. 引vLNK2001的常见错误都有哪?/strong>
遇到的LNK2001错误主要为:unresolved external symbol “symbol”
如果链接E序不能在所有的库和目标文g内找到所引用的函数、变量或标签Q将产生此错误信息?br>一般来_发生错误的原因有两个Q一是所引用的函数、变量不存在Q拼写不正确或者用错误;其次可能使用了不同版本的链接库。以下是可能产生LNK2001错误的原因:
<1>׃~码错误D的LNK2001错误
(1)不相匚w的程序代码或模块定义(.DEF)文gDLNK2001。例如,如果在C++源文件了内声明了一变量“var1”Q却试图在另一个文件内以变?#8220;var1”讉K改变量?br>(2)如果使用的内联函数是?cpp文g内定义的Q而不是在头文件内定义导致LNK2001错误?br>(3)调用函数时如果所用的参数cd和头函数声明时的cd不符会产生LNK2001错误?br>(4)试图从基cȝ构造函数或析构函数中调用虚拟函数时会DLNK2001错误?br>(5)要注意函数和变量的可公用性,只有全局变量、函数是可公用的。静态函数和静态变量具有相同的使用范围限制。当试图从文件外部方位Q何没有在该文件内声明的静态变量时导致编译错误或LNK2001错误?br><2>׃~译和联机的讄而造成的LNK2001错误
(1)如果~译时用的?NOD(/NODERAULTLIB)选项Q程序所需要的q行库和MFC时将得到又编译器写入目标文g模块Q但除非在文件中明确包含q些库名Q否则这些库不会被链接进工程文g。这U情况下使用/NOD导致LNK2001错误
(2)如果没有为wWinMainCRTStartup讑֮E序入口Q在使用Unicode和MFC时将出现“unresolved external on _WinMain@16”的LNK2001错误信息?br>(3)使用/MD选项~译Ӟ既然所有的q行库都被保留在动态链接库之内Q源文g中对“func”的引用,在目标文仉卛_“__imp__func”的引用。如果试图用静态库LIBC.LIB或LIBCMT.LIBq行链接Q将在__imp__func上发生LNK2001错误。如果不使用/MD选项~译Q在使用MSVCxx.LIB链接时也会发生LNK2001错误?br>(4)使用/ML选项~译Ӟ如用LIBCMT.LIB链接会在_errno上发生LNK2001错误?br>(5)当编译调试版的应用程序时Q如果采用发行版模态库q行链接也会产生LNK2001错误Q同P使用调试版模态库链接发行版应用程序时也会产生相同的错误?br>(6)不同版本的库和编译器的合用也能生问题,因ؓ新版的库里可能包含早先的版本没有的符号和说明?br>(7)在不同的模块中用内联和非内联的~译选项能够DLNK2001错误。如果创建C++库时打开了函数内?/Ob1?Ob2)Q但是在描述该函数的相应头文仉却关闭了函数内联(没有inline关键?Q只是将得到错误信息。ؓ避免该问题的发生Q应该在相应的头文g中用inline关键字标志ؓ内联函数?br>(8)不正的/SUBSYSTEM或ENTRY讄也能DLNK2001错误?br>
19. 如何调试一个没有源码的exe文g调用的dll
在Visual C++ 6.0中,q入“Project Setting”对话框然后选择Debug标签c通常Visual Studio默认“executable for debug session”为可执行文g名,但可以将他改成Q何你惌的程序。甚臛_以指定不同的工作目录以及传递参数到你的E序。这个技术常用来调试Dlls、名字空间扩展、COM对象和其他从某些EXE以及从第三方的EXE中调用的plug-inE序?br>
20. Visual C++ 6.0工程中的目文g都表CZ?/strong>
.optQ工E关于开发环境的参数文g。如工具条位|等信息?br>.aps(AppStudio File)资源辅助文gQ二q制格式Q一般不用去它?br>.clwQClassWizard信息文gQ实际上是INI文g格式Q有兴趣可以研究一下。有时候ClassWizardZ问题Q手工修改CLW文g可以解决。如果此文g不存在的话,每次用ClassWizard的时候回提示是否重徏?br>.dsp(DevelopStudio Project)Q项目文Ӟ文本格式Q不q不熟悉的不要手工修攏V?br>.dsw(DevelopStudio Workspace)Q是工作区文Ӟ其他特点?dsp差不多?br>.plgQ是~译信息文gQ编译时的error和warning信息文g(实际上是一个html文g)Q一般用处不大。在单击菜单【Tool】->【Option】弹出的对话框里面有个选项可以控制q个文g的生成?br>.hpj(Help Project)Q是生成帮助文g的工E,用microsoft Help Compiler可以处理?br>.mdp(Microsoft DevStudio Project)Q是旧版本的目文gQ如果要打开此文件的话,会提CZ是否转换成新?dsp格式?br>.bscQ是用于览目信息的,如果用Source Brower的话必Lq个文g。如果不用这个功能的话,可以在Project Options里面LGenerate Browse Info FileQ这样可以加快编译速度?br>.map是执行文件的映象信息记录文gQ除非对pȝ底层Q这个文件一般用不着?br>.pch(Pre-Compiled File)Q是与编译文Ӟ可以加快~译速度Q但是文仉常大?br>.pdb(Program Database)Q记录了E序有关的一些数据和调试信息Q在调试的时候可能有用?br>.expQ只有在~译DLL的时候才会生成,记录了DLL文g的一些信息,一般也没有用?br>.ncbQ无~译览文g(no compile browser)。当自动完成功能出问题时可以删除此文件。编译工E后会自动生成?

]]> - Scintilla 主要cd控g的消?/title>http://www.shnenglu.com/szhoftuncun/archive/2008/07/17/56458.html沈臻?foxtail)沈臻?foxtail)Thu, 17 Jul 2008 10:43:00 GMThttp://www.shnenglu.com/szhoftuncun/archive/2008/07/17/56458.htmlhttp://www.shnenglu.com/szhoftuncun/comments/56458.htmlhttp://www.shnenglu.com/szhoftuncun/archive/2008/07/17/56458.html#Feedback2http://www.shnenglu.com/szhoftuncun/comments/commentRss/56458.htmlhttp://www.shnenglu.com/szhoftuncun/services/trackbacks/56458.html主要c?/span>
CellBuffer
|
保存文本Q样式信息,恢复堆栈Q标{,代码叠vl构{信?/span>
|
ContractionState
|
|
Document
|
包含CellBuffer和一些高度抽象操作,理样式处理?/span>
|
Editor
|
使用ContractionState, Indicator, LineMarker, Style, ViewStyle来显C文?/span>KeyMap?/span>ContractionState同样在这里用?/span>
|
Indicator
|
|
LineMarker
|
|
Style
|
|
ViewStyle
|
|
KeyMap
|
|
ScintillaBase
|
Editor的子c,增加了调用提C和自动完成{功能,使用c?/span>CallTip?/span>AutoComplete
|
CallTip
|
|
AutoComplete
|
|
Scintilla文档的每个字W都紧跟兌的样式信息。一个字节的字符信息和一个字节的样式信息作ؓ一个单位。样式信息高3位是指示器,?/span>5位是索引受烦引号索引一个存放样式的数组。这样就可以表示32U基样式Q几乎包含所有语a的样式。三个无xC器可以一ơ显C法错误,非法命名Q和~进错误。关于样式的位可以通过SCI_SETSTYLEBITS来改变最多其?/span>7位,剩下的位用于指示器?/span>
字符位置信息?/span>0开始计敎ͼ?/span>nLen-1Q中文的字符是两个字Wؓ一个文字,q样计数有误了Q?/span>DBCSQ?/span>
Scintilla的消息都是以SCI_GETxxx或?/span>SCI_SETxxx来命名的
一Q?/span>文本取回与修?/span>
主要消息有:


SCI_GETTEXT(int length, char *text)

SCI_SETTEXT(<unused>, const char *text)

SCI_SETSAVEPOINT

SCI_GETLINE(int line, char *text)

SCI_REPLACESEL(<unused>, const char*text)

SCI_SETREADONLY(bool readOnly)

SCI_GETREADONLY

SCI_GETTEXTRANGE(<unused>, TextRange*tr)

SCI_ALLOCATE(int bytes, <unused>)

SCI_ADDTEXT(int length, const char *s)

SCI_ADDSTYLEDTEXT(int length, cell *s)

SCI_APPENDTEXT(int length, const char*s)

SCI_INSERTTEXT(int pos, const char*text)

SCI_CLEARALL

SCI_CLEARDOCUMENTSTYLE

SCI_GETCHARAT(int position)

SCI_GETSTYLEAT(int position)

SCI_GETSTYLEDTEXT(<unused>, TextRange*tr)

SCI_SETSTYLEBITS(int bits)

SCI_GETSTYLEBITS

SCI_TARGETASUTF8(<unused>, char *s)

SCI_ENCODEDFROMUTF8(const char *utf8,char *encoded)

SCI_SETLENGTHFORENCODE(int bytes)


1Q?/span>SCI_GETTEXT(int length, char *text)
此函数可以取得控件中的字W串存到一个缓冲区Q这样就可以保存文档了。流E是使用SCI_GETLENGTH
获得字符串的长度然后Ҏ取得的长度申请一个缓冲区Q再利用该消息取得文本,然后可以保存文本了Q同旉要利?/span>
SCI_SETSAVEPOINT
标记文本已保存了?/span>
做了例子果然是可以运行的Q不知道作者是如何制作q样一个控件的。我对他的内部运行机制很感兴,想仔l看一些具体的代码Q而不是仅仅用它。另外发?/span>
API
使用的字W是宽字W,q一点很令h讨厌?br>
另外获取处理函数的过E用了上ơ写的typedef的用法,改一下看上去清晰多?br>
typedef int (*EditorSendFun)(void*,int,int,int);
void* ptr;
EditorSendFun editsendmessage;

]]> - 如何使用Scintilla~辑控ghttp://www.shnenglu.com/szhoftuncun/archive/2008/07/13/56049.html沈臻?foxtail)沈臻?foxtail)Sun, 13 Jul 2008 13:07:00 GMThttp://www.shnenglu.com/szhoftuncun/archive/2008/07/13/56049.htmlhttp://www.shnenglu.com/szhoftuncun/comments/56049.htmlhttp://www.shnenglu.com/szhoftuncun/archive/2008/07/13/56049.html#Feedback0http://www.shnenglu.com/szhoftuncun/comments/commentRss/56049.htmlhttp://www.shnenglu.com/szhoftuncun/services/trackbacks/56049.html一Q?/span>如何在窗口中建立Scintilla~辑控g
1. 载入动态链接库
1
hmod = LoadLibrary("SciLexer.DLL");
2
if (hmod==NULL)
3

{
4
MessageBox(hwndParent,
5
"The Scintilla DLL could not be loaded.",
6
"Error loading Scintilla",
7
MB_OK | MB_ICONERROR);
8
}
9
2. 创徏H口Q已l注册)
hwndScintilla = CreateWindowEx(0,
"Scintilla","", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_CLIPCHILDREN,
10,10,500,400,hwndParent,(HMENU)GuiID, hInstance,NULL);

二.如何控制H口cL?/span>
Ҏ一Q给控g发送消息和接受来自控g的响?/span>
SendMessage(hwndScintilla,sci_command,wparam,lparam);
Ҏ二:首先通过SCI_GETDIRECTFUNCTION ?/span> SCI_GETDIRECTPOINTER消息获取~辑控g回调函数的指针和W一个参敎ͼ接下来就可以直接使用~辑控g的消息处理函C?/span>
int (*fn)(void*,int,int,int);
void * ptr;
fn = (int (__cdecl *)(void *,int,int,int))SendMessage(hwndScintilla,SCI_GETDIRECTFUNCTION,0,0);
ptr = (void *)SendMessage(hwndScintilla,SCI_GETDIRECTPOINTER,0,0);

然后使用该回调函敎ͼ
fn(ptr,sci_command,wparam,lparam);
三.如何接受响应
只要在父H口消息处理函数中对WM_NOTIFY消息做相应处?/pre>
NMHDR *lpnmhdr;
[
]
case WM_NOTIFY:
lpnmhdr = (LPNMHDR) lParam;
if(lpnmhdr->hwndFrom==hwndScintilla)


{
switch(lpnmhdr->code)


{
case SCN_CHARADDED:
[…]
break;
}}
break;

整个q程没有M问题Q做好后是这个样子的Download?br>此时你会发现该控件你没有发送Q何消息就已经具备了一定的功能Q有redo undo操作Q还有复刉贴?/span>

]]>
- windowsE序设计Q滚动条Q?/title>http://www.shnenglu.com/szhoftuncun/archive/2008/01/22/41675.html沈臻?foxtail)沈臻?foxtail)Tue, 22 Jan 2008 14:33:00 GMThttp://www.shnenglu.com/szhoftuncun/archive/2008/01/22/41675.htmlhttp://www.shnenglu.com/szhoftuncun/comments/41675.htmlhttp://www.shnenglu.com/szhoftuncun/archive/2008/01/22/41675.html#Feedback1http://www.shnenglu.com/szhoftuncun/comments/commentRss/41675.htmlhttp://www.shnenglu.com/szhoftuncun/services/trackbacks/41675.html阅读全文

]]> - windows~程(输出文字)http://www.shnenglu.com/szhoftuncun/archive/2008/01/21/41565.html沈臻?foxtail)沈臻?foxtail)Mon, 21 Jan 2008 07:50:00 GMThttp://www.shnenglu.com/szhoftuncun/archive/2008/01/21/41565.htmlhttp://www.shnenglu.com/szhoftuncun/comments/41565.htmlhttp://www.shnenglu.com/szhoftuncun/archive/2008/01/21/41565.html#Feedback0http://www.shnenglu.com/szhoftuncun/comments/commentRss/41565.htmlhttp://www.shnenglu.com/szhoftuncun/services/trackbacks/41565.html阅读全文

]]> - windows~程Q窗口与消息Q?/title>http://www.shnenglu.com/szhoftuncun/archive/2008/01/19/41479.html沈臻?foxtail)沈臻?foxtail)Sat, 19 Jan 2008 12:03:00 GMThttp://www.shnenglu.com/szhoftuncun/archive/2008/01/19/41479.htmlhttp://www.shnenglu.com/szhoftuncun/comments/41479.htmlhttp://www.shnenglu.com/szhoftuncun/archive/2008/01/19/41479.html#Feedback0http://www.shnenglu.com/szhoftuncun/comments/commentRss/41479.htmlhttp://www.shnenglu.com/szhoftuncun/services/trackbacks/41479.html阅读全文

]]> - windowsE序设计(开?http://www.shnenglu.com/szhoftuncun/archive/2008/01/18/41443.html沈臻?foxtail)沈臻?foxtail)Fri, 18 Jan 2008 14:05:00 GMThttp://www.shnenglu.com/szhoftuncun/archive/2008/01/18/41443.htmlhttp://www.shnenglu.com/szhoftuncun/comments/41443.htmlhttp://www.shnenglu.com/szhoftuncun/archive/2008/01/18/41443.html#Feedback3http://www.shnenglu.com/szhoftuncun/comments/commentRss/41443.htmlhttp://www.shnenglu.com/szhoftuncun/services/trackbacks/41443.html阅读全文

]]>
һ㽶þֻ|
þþҹƷ|
ݺݺݾþ|
Ʒþþþû|
þþƷĻ|
þþƷžƷ|
ŷþþþƷ|
avҹһƬѿþ|
þù|
97þۺϾƷþþۺ|
þɫۺҹž|
˾ھƷþþþ|
պŷۺϾþ
|
ԾþþӰԺ|
97Ʒ˾þô߽app|
˼˼þ99ѾƷ6|
þþƷֻоƷ2020|
Ʒþþþþþþþþþ
|
ɫݺݾþۺ|
Ʒ۲ӰԺþ|
þ99ۿҳ
|
þþûƬ|
þСƵ|
avҹһƬѿþ|
Ʒ˾þ|
ŷպƷþþþ|
Ʒ۲ӰԺþ|
ۺþþ|
þ99Ʒþþ|
˹ھƷþþþһ|
97Ʒ˾þþô߽97|
һþöAV
|
ŷƷþþþþþο|
þպƬ|
ƷþþþAV鶹|
ŷһþþþþþô|
߳þѹۿ|
ݾƷŮ˾þþþþ|
ҹþþþþ|
ƷžžþþƷŮͬŷպۺ
|
þó18վ|