??xml version="1.0" encoding="utf-8" standalone="yes"?>
An add-on for this website failed to run. Check the security settings in Internet options for potential conflicts.
只要你將 IE 更新?IE8Q再使用 Visual Studio 2005 ?Visual Studio 2008 打開 Class WizardQ登ȝ击I上圖的錯誤畫面就會出現了Q?/p>
?Visual C++ Team Blog 所qͼ以下四?Wizard 都受到媄(jing)響:(x)
珑֜唯一的方法是修改 Registry Q?/p>
修改完成後,不用重新開機Q关闭Visual Studio后再打开能够立刻恢复正常! H如果是 Visual Studio 2005Q則必需安裝 SP1QVisual C++ Team Blog 有詳q問成因,有興的朋友可以ȝ看。﹞
珑֜ Visual C++ Team 好像還在?IE 斚w進行溝?.. 看看?IE 推出修正檔還是在 VS 推出?/p>
Visual C++ Team Blog: http://blogs.msdn.com/vcblog/archive/2009/03/28/some-vs2005-and-vs2008-wizards-pop-up-script-error.aspx
1、头文g?span lang="EN-US">C格式Q但是函数实现是C++的?span lang="EN-US">
解决办法Q在.h文g中添?/span>
#if __cplusplus extern "C" { #endif /* 代码?span lang="EN-US"> */
#if __cplusplus
}
#endif
2、头文g的函数声明参数类型与cpp文g中的函数定义不一?span lang="EN-US">
调整Z致即可?span lang="EN-US">
Ҏ(gu)上面的分析,对于需要实现强c聚Q低耦合的程序而言Q其最l目的与cd装的目的基本一致。在考虑如何实现Ӟ可以借用OOP的方法?/p>
具体归纳如下Q?/p>
1、实现数据的装
使用struct一l行为的q对象打包?/p>
2、将模块独立化ؓ(f)文g
?nbsp; 形式?/p>
需要供外部使用的API接口攑֜.h中,模块内部函数攑֜.c文g中?/p>
?nbsp; 实现?/p>
文g中的函数的操作对象只能是q个struct中的成员。不要让文g外的全局变量来决定模块行为的执行路径。这L(fng)目的在于模块的行为只能由模块自n的状态决定?/p>
3、对?模块)的状态控?/strong>
模块的状态也应该使用专门的操作函数进行封装?/p>
目的是防止全局变量滥用Q修改状态的行ؓ(f)Ҏ(gu)被监视与控制?/p>
实际~程中,使用全局变量方式的状态控制场合,状态的变更l常被遗漏。强制用函数对状态的q入与退行标识,防止遗忘?/p>
4、行为控?/strong>
执行的某一行ؓ(f)的判断条件进行封装?nbsp;
在复杂系l中Q一个行为的执行q不是能够由单一的Eventp触发。而是需要诸多状态条件的成立。这U情况下Q需要把行ؓ(f)的执行决{提gؓ(f)决策函数,集中理?/p>
各个状态作入,控制函数是响应函敎ͼ输出的是响应行ؓ(f)?nbsp;
而言之就是让诸葛亮这个专家去判断【天时】、【地利】、【h和】这些条件是不是都具备了Q是不是可以操家伙了。如果还没有Q那个孔明兄p决策是不是装弄g下,借点东风或是发挥自n才能造出木牛马来帮帮忙?/p>
好处Q?/p>
?nbsp; 减少代码冗余?/p>
需要添加变更的场合Q只需要更改这一个决{类卛_?/p>
?nbsp; 集中优势兵力歼灭敌h的有生力量?/p>
ȝQ?/strong>
上面的方法的Ҏ(gu)目的在于Q限制行为,其固定在一l数据的集合上。减耦合性?/p>
上面的方法只是从E序l构上控制实现方式,避免出错的可能。不可能解决所有问题。但主要的解x向是Q采用OOP的思想Q限制行为,避免全局变量满天飞?/p>
CWindowDC
: 讑֤环境的映区域ؓ(f)整个H口Q包括标题栏、状态栏、窗口边框等Q。原点(
0
Q?/span>
0
Q在整个H口的左上角?/span>
CPaintDC:
当需要重?/span>
OnPaint
函数的时候,需要?/span>
CPaintDC
cR?/span>
视图H口没有非客户区?/span>.
在已l分配的动态内存空间上使用
new
创徏新的对象。这UŞ式的
new
表达式就?/span>
placement new expression
?/span>
2.
使用格式
new(place_address) type_specifier
?span style="FONT: 7pt 'Times New Roman'">
place_address
Q已l开辟空间的指针
?span style="FONT: 7pt 'Times New Roman'">
type_specifier
Q新分配对象的类?/span>
3.
实例
int *pBuff = new int[1000];
long *pb = new(pBuff) long; //
卛_
pBuff
内的一块大ؓ(f)
sizeof(long)
的内存区域的
//
使用权给
pb
指向的对象?/span>
4.
使用注意
?span style="FONT: 7pt 'Times New Roman'">
需?/span>
#include<new>
?span style="FONT: 7pt 'Times New Roman'">
不需?/span>
delete pb
Q?/span>
//
因ؓ(f)q没有ؓ(f)
pb
开辟一块内存?/span>
pb
指向的对象只有用权
如果使用
delete []pBuff; //
意味着其内存空间上的所有对象都?/span>
kill
?/span>
一个由
C++
~译的程序占用的内存分ؓ(f)以下几个部分
1
、栈区(
stack
Q?br />
q译器自动分配释放
Q?/font>
存放函数的参数|局部变量的值等。其操作方式cM?/span>
数据l构
中的栈?br />
2
、堆区(
heap
Q?/span>
q序员分配释放Q?/span>
若程序员不释放,E序l束时可?/span>
OS
回收
。存攄是动态分配的数据对象?/font>
注意它与数据l构中的堆是两回事,分配方式倒是cM于链表?/span>
3
、全局区(静态区Q(
static
Q?/span>
全局变量和静态变量的存储是放在一块的Q初始化的全局变量和静态变量在一块区域,
未初始化的全局变量和未初始化的静态变量在盔R的另一块区域?/span>
E序l束后由pȝ释放
4
、文字常量区
帔R字符串就是放在这里的?/span>
E序l束后由pȝ释放
5
、程序代码区
存放函数体的二进制代码?/span>
1 、与数据对象相关的值有两种Q?/span>
n 数据?/span>
卛_储在某个内存地址中的数据本n?/span>
n 地址?/span>
卌数据对象的存储位|?/span>
2 ?/span> lvalue ?/span> rvalue
n lvalue 通常指的是可以寻址q且可以对该地址内容存储的对象进行写操作 (writeable) 。可以看?/span> location value ?/span>
n rvalue 通常指的是那些能够提供数据值的数据Q即从某?/span> mem 中读出的 value 。可以认为是 read value ?/span>
3 、文字常量( literate const Q与变量Q?/span> variable Q?/span>
n 文字帔R
即通常指的数字Q?/span> 1 Q?/span> 200 Q。。。)(j)。该数据对象分配在常量内存区域,不可以寻址Q也是不可以通过操作它的地址值来变更的数据对象。因此不能作?/span> lvalue 出现Q只能是 rvalue
n 变量
可以d。通过变量名就可以改变该数据地址的内宏V所以可以成?/span> lvalue ?/span> rvalue
ȝQ?/span>
u lvalue Q可以通过数据对象自n地址来改变数据对象值的数据对象Q要求该对象可以d?/span>
u rvalue Q能够提供数据对象本w数值的数据对象Q该对象不一定可以寻址
u 由操作符军_需要什么类型的数据值类?/span>
注意Q?/span>
lvalue 中的 ’l?/span> 不是 left 的意思,既不是指在操作符左边。同?/span> ’r?/span> 不是 right
例如Q?/span>
x++;
++x;
两个表达式均要求 x ?/span> lvalue ?/span>
使用举例Q?/span>
? 0=1 Q?/span> //error, 0 不是 lvalue
? x+0.1*y=z; //error, 在赋D符左边的应该ؓ(f) lvalue
? const int size=4;
size=10; //error, 数据对象地址内容不可以改变,即不?/span> writeable
2?span style="FONT: 7pt 'Times New Roman'">
?/span> OnInitialUpdate 中添加初始化?/span> Scroll 的相兛_性?/span>
CSize sizeTotal(0,0);
SetScrollSizes(MM_TEXT,sizeTotal);
3?span style="FONT: 7pt 'Times New Roman'">
打开文g ( 囑փ?/span> ) Ҏ(gu)囑փ的大,讄滚动属性?/span>
ChangeScrollRange(); //
自定义函?/span>
4?span style="FONT: 7pt 'Times New Roman'">
?/span> View cMd成员变量?/span>
作用是存储图像显CZ|与原点?/span>
offset
int
m_ImgVScrollPos
;
// VScroll distance
int
m_ImgHScrollPos
;
// HScroll distance
5?span style="FONT: 7pt 'Times New Roman'">
滚动处理
d自定义响?/span>
WM_VSCROLL
?/span>
WM_HSCROLL
消息的事件函敎ͼ(x)
OnVScroll
?/span>
OnHScroll
void
CSockIIView
::
OnVScroll
(
UINT
nSBCode
,
UINT
nPos
,
CScrollBar
*
pScrollBar
)
{
// TODO: Add your message handler code here and/or call default
SCROLLINFO
si
;
GetScrollInfo
(
SB_VERT
,&
si
,
SIF_ALL
);
m_ImgVScrollPos
=
si
.
nPos
;
Invalidate
(
TRUE
);
CScrollView
::
OnVScroll
(
nSBCode
,
nPos
,
pScrollBar
);
}
6?span style="FONT: 7pt 'Times New Roman'">
囑փ昄
更改
OnPaint
函数中图像显C的代码Q?/span>
dc
.
BitBlt
(
rc
.
left
,
rc
.
top
,
rc
.
Width
(),
rc
.
Height
(),
m_pMemDC
,
rc
.
left
,
rc
.
top
,
SRCCOPY
);
为:(x)
dc.BitBlt(rc.left,rc.top,rc.Width(),rc.Height(),m_pMemDC,(rc.left+m_ImgHScrollPos),(rc.top+m_ImgVScrollPos),SRCCOPY);
备注Q?/span>
Ø
SetScrollSizes() MFC
库函敎ͼ讄滚动条属性。参数含义参?/span>
MSDN
?/span>
void SetScrollSizes(
int nMapMode, //
影射模式?/span>
SIZE sizeTotal, //
滚动范围Q即所?/span>
page
加v来的高度或宽?/span>
const SIZE& sizePage = sizeDefault, //
每页的大。根据模式的不同Q度量的度不同
const SIZE& sizeLine = sizeDefault //
每行的大。根据模式的不同Q度量的度不同
);
nMapMode
Q一般?/span>
MM_TEXT
Q以像素为单位。参?/span>
MSDN
Ø
BitBlt
Q?/span>
内存中的图拯到屏q上q行昄。参数含?/span>
参见
MSDN
?/span>
BOOL BitBlt(
HDC hdcDest, // handle to destination DC
int nXDest, // x-coord of destination upper-left corner
int nYDest, // y-coord of destination upper-left corner
int nWidth, // width of destination rectangle
int nHeight, // height of destination rectangle
HDC hdcSrc, // handle to source DC
int nXSrc, // x-coordinate of source upper-left corner
int nYSrc, // y-coordinate of source upper-left corner
DWORD dwRop // raster operation code
);
如有疑问Q欢q留a?/span>