- 博客(50)
- 资源 (11)
- 收藏
- 关注
原创 VC 使窗口透明的2种方法
1、 CRect rcWindow; GetWindowRect(&rcWindow); CRect rcClient; GetClientRect(&rcClient); ClientToScreen(&rcClient); CRgn rgnWindow;
2011-10-11 03:23:04
8905
原创 双缓冲
普通重绘双缓冲 // pDC为已获取的屏幕DC [10/10/2011 LuiGY] CRect rcClient; GetClientRect(&rcClient); // 创建内存DC [10/10/2011 LuiGY] CDC memDC; memDC.
2011-10-10 13:26:25
813
原创 关于Invalidate和UpdateWindow
Invalidate调用后,会向消息队列里增加一个WM_PAINT消息,所以调用此函数,界面不会立刻被刷新(需要排队)。消息队列里可能有多个WM_PAINT消息,为了增加效率,系统会将多个WM_PAINT消息合并成一个,并且将每个WM_PAINT的无效区域也合并,合并后的无效
2011-09-28 17:59:48
817
转载 MFC DestroyWindow
考虑单窗口情况: 假设自己通过new创建了一个窗口对象pWnd,然后pWnd->Create。则销毁窗口的调用次序: 1. 手工调用pWnd->DestroyWindow(); 2. DestroyWindow会发送WM_DESTROY; 3. WM_DESTROY对应的消息处理函数是OnDestroy(); 4. DestroyWindow会发送WM_NCDESTROY;
2011-06-27 16:20:00
4217
原创 判断一个数字是否为质数-------摘自《C++标准程序库》
bool IsPrime(int number){ number = abs(number); if (0 == number || 1 == number) { return true; } int divisor; for (divisor = number/2; number%divisor != 0; --divisor) { } re
2011-06-12 17:18:00
1825
原创 将整型以二进制方式写入文件
<br />#include <fstream>#include <iostream>using namespace std;int main(){ fstream fOut("R://a.txt", ios::in | ios::out | ios::trunc); if (!fOut.bad()) { int i; cin>>i; fOut.write(reinterpret_cast<const char*>(&i), sizeof(int));
2011-05-19 20:38:00
2063
转载 对话框贴背景图的几种方法
<br />方法一:<br />处理ON_WM_ERASEBKGND消息,在OnEraseBkgnd里加如下代码<br /> CDC MemDC; //CBitmap对象 CBitmap Bitmap,*pOldBitmap; //BITMAP句柄 BITMAP bm; //加载位图 Bitmap.LoadBitmap(IDB_BITMAP1); //将位图资源与句柄绑定 Bitmap.GetObject(sizeof(BITMAP),&bm); //创建与内存
2011-05-10 10:22:00
1118
原创 用LVSCW_AUTOSIZE_USEHEADER,让CListCtrl的最后一列适应宽度
1、SetRedraw(FALSE) //先禁掉自动重绘,以免闪屏、影响效率2、获取list原始大小 rect3、设置list大小,让list变得水平很小,垂直很大4、对每一列调用SetColumnWidth,第二个参数用LVSCW_AUTOSIZE_USEHEADER5、把list设为原来的大小 rect6、SetRedraw(TRUE) //恢复重绘7、Invalidate 刷新<br /> <br /> <br />一点说明:<br />第3步里,有水平滚动条时,最后一列才能设置成正确的大
2010-07-02 19:00:00
6674
1
原创 模态对话框使用OnOK结束时,ASSERT(ContinueModal())断言处报错
BOOL CWnd::ContinueModal(){ return m_nFlags & WF_CONTINUEMODAL;}从源代码可以看出,报错的原因是对话框没有了WF_CONTINUEMODAL属性,模态对话框默认是有这个属性的,再看看是哪个地方去掉了这个属性呢?再看下面几段源代码:void CDialog::OnCancel(){ EndDialog(IDCANCEL);}void CDialog::EndDialog(int nResult){ ASSER
2010-07-02 16:59:00
5962
6
原创 去除字符串中首尾的空格
void change(char *p){ int nLen = strlen(p); int nFirst = 0; int nLast = 0; for (int i=0; i!=nLen; ++i) { if ( != *(p+i)) { nFirst = i; break; } } for (int i=nLen-1;
2010-04-17 14:46:00
940
原创 对象的复制
#include using namespace std;class test{public: int *pI; test() { pI = new int; } ~test() { delete pI; }};void tryit(){ test t1; *(t1.pI) = 5; test t2 =
2010-04-16 14:08:00
457
原创 字符串流
iostream 标准库支持内存中的输入/输出,只要将流与存储在程序内存中的 string 对象捆绑起来即可。此时,可使用 iostream 输入和输出操作符读写这个 string 对象。标准库定义了三种类型的字符串流:istringstream,由 istream 派生而来,提供读 string 的功能。ostringstream,由 ostream 派生而来,提供写 string 的功能。st
2008-11-17 14:31:00
1718
原创 文件I/O
fstream 头文件定义了三种支持文件 IO 的类型:1、ifstream,由 istream 派生而来,提供读文件的功能。2、ofstream,由 ostream 派生而来,提供写文件的功能。3、fstream,由 iostream 派生而来,提供读写同一个文件的功能。这些类型都由相应的 iostream 类型派生而来,这个事实意味着我们已经知道使用 fstream 类型需要了解的大部分内容了
2008-11-13 18:11:00
916
原创 缓冲区
每个 IO 对象管理一个缓冲区,用于存储程序读写的数据。如有下面语句: os 系统将字符串字面值存储在与流 os 关联的缓冲区中。下面几种情况将导致缓冲区的内容被刷新,即写入到真实的输出设备或者文件:1、程序正常结束。作为 main 返回工作的一部分,将清空所有输出缓冲区。2、在一些不确定的时候,缓冲区可能已经满了,在这种情况下,缓冲区将会在写下一个值之前刷新。3、用操纵符(第 1.2.2
2008-11-13 17:45:00
893
2
原创 ,操作符
逗号操作符的求解过程:首先计算它的每一个操作数,然后返回最右边操作数作为整个操作的结果。int i;while(cin>>i,iif(1,0) //条件恒为假if(0,1) //条件恒为真if(x,x,1) //x为任意,恒为真//a = 1, b = 1if(++a,a+b-2) //条件为真,++a使a = 2,于是a+b-2=1,先计算左侧值,最后再取最右的值
2008-11-13 16:20:00
494
原创 指向函数的指针
函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关: // pf points to function returning bool that takes two const string references bool (*pf)(const string &, const string &);
2008-11-07 15:46:00
1467
原创 重载函数参数的转换和匹配
为了确定最佳匹配,编译器将实参类型到相应形参类型转换划分等级。转换等级以降序排列如下:1、精确匹配。实参与形参类型相同。2、通过类型提升实现的匹配(第 5.12.2 节)。3、通过标准转换实现的匹配(第 5.12.3 节)。4、通过类类型转换实现的匹配(第 14.9 节将介绍这类转换)。类型提升或转换适用于实参类型可通过某种标准转换提升或转换为适当的形参类型情况。必须注意的一个重点是较小的整型提升
2008-11-07 15:14:00
3734
1
转载 深拷贝与浅拷贝
http://blog.chinaunix.net/u/25952/showart_274326.html 浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值。但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件。。当 值拷贝的时候,两个对象就有用共同的资源,同时对资源可以访问,这样就会出问题。深拷贝就是用来解决这样的问题的,它把资源也赋值一次,使对象拥有不同的
2008-11-07 14:43:00
1001
1
转载 随机数
1. 如何产生一定范围内的随机数?直接的方法是: rand() % N;返回从 0 到 N - 1 的数字。但这个方法不好,因为许多随机数发生器的低位比特并不随机。一个较好的方法是: (int)((double)rand() / ((double)RAND_MAX + 1) * N);如果你不希望使用 double,另一个方法是: rand() / (RAND_MAX / N +
2008-11-07 13:26:00
530
转载 c语言中 a[6] = a[3+3] = (6)[a]
因为编译器对于数组是转换为指针的。a[6]会被转为 *(a+6),a[3+3]被转为*(a+3+3),又因为对于常量运算式会计算出最后结果,所以最终也会转为*(a+6)。同样的道理,6[a]被转为*(6+a),和*(a+6)等价。上面的这些转换在编译的语法分析阶段就完成了,在语法分析生成的中间表示已经能看到各个表达式都被翻译成同样的中间表示。原文地址:http://blog.sina.com.cn
2008-11-07 13:22:00
1460
原创 最简单的重载
#includeusing namespace std;void fun(double a);void fun(int a,int b = 2);void main(){ int i = 1; fun(i);}void fun(double a){ cout}void fun(int a, int b /*= 2*/){ cout}红色部分不注释掉会报错:error C2572: fun :
2008-11-07 11:58:00
504
原创 重载
如果两个函数声明的返回类型和形参表完全匹配,则将第二个函数声明视为第一个的重复声明。如果两个函数的形参表完全相同,但返回类型不同,则第二个声明是错误的: Record lookup(const Account&); bool lookup(const Account&); // error: only return type is different函数不能仅仅基于不同的返回类型而
2008-11-07 11:24:00
590
原创 构造函数
构造函数是特殊的成员函数,与其他成员函数不同,构造函数和类同名,而且没有返回类型。而与其他成员函数相同的是,构造函数也有形参表(可能为空)和函数体。一个类可以有多个构造函数,每个构造函数必须有与其他构造函数不同数目或类型的形参。构造函数的形参指定了创建类类型对象时使用的初始化式。通常,这些初始化式会用于初始化新创建对象的数据成员。构造函数通常应确保其每个数据成员都完成了初始化。Sales_item
2008-11-06 16:47:00
717
原创 类的成员函数
class Sales_item { public: // operations on Sales_item objects double avg_price() const; bool same_isbn(const Sales_item &rhs) const { return isbn == rhs.
2008-11-06 16:38:00
4178
原创 inline
const string &shorterString(const string &s1, const string &s2) { return s1.size() }将函数指定为 inline 函数,(通常)就是将它在程序中每个调用点上“内联地”展开。假设我们将 shorterString 定义为内联函数,则调用: cout 在编译时将展开为:
2008-11-06 16:12:00
471
原创 输入两个字符串,返回较长的一个
// find longer of two strings const string &shorterString(const string &s1, const string &s2) { return s1.size() }为这样的小操作定义一个函数的好处是:1、阅读和理解函数 shorterString 的调用,要比读一条用等价的条件表达式取代函数调
2008-11-06 16:08:00
677
原创 静态局部变量
一个变量如果位于函数的作用域内,但生命期跨越了这个函数的多次调用,这种变量往往很有用。则应该将这样的对象定义为 static(静态的)。static 局部对象确保不迟于在程序执行流程第一次经过该对象的定义语句时进行初始化。这种对象一旦被创建,在程序结束前都不会撤销。当定义静态局部对象的函数结束时,静态局部对象不会撤销。在该函数被多次调用的过程中,静态局部对象会持续存在并保持它的值。考虑下面的小例子
2008-11-06 16:04:00
885
原创 默认实参
默认实参是一种虽然并不普遍、但在多数情况下仍然适用的实参值。调用函数时,可以省略有默认值的实参。编译器会为我们省略的实参提供默认值。默认实参是通过给形参表中的形参提供明确的初始值来指定的。程序员可为一个或多个形参定义默认值。但是,如果有一个形参具有默认实参,那么,它后面所有的形参都必须有默认实参。例如,下面的函数创建并初始化了一个 string 对象,用于模拟窗口屏幕。此函数为窗口屏幕的高、宽和背
2008-11-06 15:49:00
2753
1
原创 递归
直接或间接调用自己的函数称为递归函数。一个简单的递归函数例子是阶乘的计算。数 n 阶乘是从 1 到 n 的乘积。例如,5 的阶乘就是 120。 1 * 2 * 3 * 4 * 5 = 120解决这个问题的自然方法就是递归: // calculate val!, which is 1*2 *3 ... * val int factorial(int val) {
2008-11-06 15:04:00
990
1
原创 函数返回值
不带返回值的 return 语句只能用于返回类型为 void 的函数。在返回类型为 void 的函数中,return 返回语句不是必需的,隐式的 return 发生在函数的最后一个语句完成时。一般情况下,返回类型是 void 的函数使用 return 语句是为了引起函数的强制结束,这种 return 的用法类似于循环结构中的 break 语句的作用。例如,可如下重写 swap 程序,使之在输入的两
2008-11-06 14:43:00
14848
5
原创 使用引用形参返回额外的信息
引用形参的另一种用法是向主调函数返回额外的结果。函数只能返回单个值,但有些时候,函数有不止一个的内容需要返回。例如,定义一个 find_val 函数。在一个整型 vector 对象的元素中搜索某个特定值。如果找到满足要求的元素,则返回指向该元素的迭代器;否则返回一个迭代器,指向该 vector 对象的 end 操作返回的元素。此外,如果该值出现了不止一次,我们还希望函数可以返回其出现的次数。在这种
2008-11-03 15:30:00
1650
原创 swap
// incorrect version of swap: The arguments are not changed! void swap(int v1, int v2) { int tmp = v2; v2 = v1; // assigns new value to local copy of the argument v1
2008-11-03 14:47:00
446
原创 指针形参
函数的形参可以是指针,此时将复制实参指针。与其他非引用类型的形参一样,该类形参的任何改变也仅作用于局部副本。如果函数将新指针赋给形参,主调函数使用的实参指针的值没有改变。事实上被复制的指针只影响对指针的赋值。如果函数形参是非 const 类型的指针,则函数可通过指针实现赋值,修改指针所指向对象的值: void reset(int *ip) { *ip = 0; /
2008-11-03 14:23:00
1427
1
原创 求两个int变量的最大公约数
int gcd(int v1, int v2) { while (v2) { int temp = v2; v2 = v1 % v2; v1 = temp; } return v1; }
2008-10-28 14:58:00
662
原创 try和异常处理
C++ 的异常处理中包括:throw 表达式,错误检测部分使用这种表达式来说明遇到了不可处理的错误。可以说,throw 引发了异常条件。try 块,错误处理部分使用它来处理异常。try 语句块以 try 关键字开始,并以一个或多个 catch 子句结束。在 try 块中执行的代码所抛出(throw)的异常,通常会被其中一个 catch 子句处理。由于它们“处理”异常,catch 子句也称为处理代码
2008-10-28 14:18:00
4604
2
原创 goto
goto 语句提供了函数内部的无条件跳转,实现从 goto 语句跳转到同一函数内某个带标号的语句。goto 语句的语法规则如下: goto label;其中 label 是用于标识带标号的语句的标识符。在任何语句前提供一个标识符和冒号,即得带标号的语句: end: return; // labeled statement, may be target of a goto形成标号的标
2008-10-28 11:49:00
4324
原创 continue
continue 语句导致最近的循环语句的当次迭代提前结束。对于 while 和 do while 语句,继续求解循环条件。而对于 for 循环,程序流程接着求解 for 语句头中的 expression 表达式。例如,下面的循环每次从标准输入中读入一个单词,只有以下划线开头的单词才做处理。如果是其他的值,终止当前循环,接着读取下一个单词: string inBuf; while
2008-10-28 11:43:00
548
原创 do-while
// repeatedly ask user for pair of numbers to sum string rsp; // used in the condition; cant be defined inside the do do { cout int val1, val2; cin >> val1 >> val2;
2008-10-28 10:32:00
754
1
原创 for
for 语句的语法形式是: for (init-statement condition; expression) statementinit-statement 必须是声明语句、表达式语句或空语句。这些语句都以分号结束。一般来说,init-statement 用于对每次循环过程中都要修改的变量进行初始化,或者赋给一个起始值。而 condition 则是用来控制循环的。当
2008-10-28 10:01:00
466
windows7 7077种子(ISO)
2009-04-08
7号信令 相关资源 详细教材
2009-01-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人