); //取客户区大小
7. Newp.x=recta.right-recta.left;
8. Newp.y=recta.bottom-recta.top;
9. fsp[0]=(float)Newp.x/old.x;
10. fsp[1]=(float)Newp.y/old.y;
11. CRect Rect;
12. int woc;
13. CPoint OldTLPoint,TLPoint; //左上角
14. CPoint OldBRPoint,BRPoint; //右下角
15. HWND hwndChild=::GetWindow(m_hWnd,GW_CHILD); //列出所有控件
16. while(hwndChild)
17. {
18. woc=::GetDlgCtrlID(hwndChild);//取得ID
19. GetDlgItem(woc)->GetWindowRect(Rect);
20. ScreenToClient(Rect);
21. OldTLPoint = Rect.TopLeft();
22. TLPoint.x = long(OldTLPoint.x*fsp[0]);
23. TLPoint.y = long(OldTLPoint.y*fsp[1]);
24. OldBRPoint = Rect.BottomRight();
25. BRPoint.x = long(OldBRPoint.x *fsp[0]);
26. BRPoint.y = long(OldBRPoint.y *fsp[1]);
27. Rect.SetRect(TLPoint,BRPoint);
28. GetDlgItem(woc)->MoveWindow(Rect,TRUE);
29. hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT);
30. }
31. old=Newp;
32. } 总结:就个人而言,本人还是比较倾向第二种方法,毕竟可以少操作控件ID,否则少了一个布局都会发生变化。版权声明:本文为博主原创文章,未经博主允许不得转载。28、1.#include #include
void SearchFile(const char* FileName, const char* Path, TStrings* Strings)
{
char *Name;
char File[512];
struct ffblk blk;
strcpy(File, Path);
Name = File+strlen(File);
if (*(Name-1)!='\\') *Name++ = '\\';
strcpy(Name, "*.*");
if (findfirst(File,&blk,FA_RDONLY|
FA_HIDDEN|FA_SYSTEM|FA_DIREC))
return;
do {
strcpy(Name, blk.ff_name);
if (blk.ff_attrib&FA_DIREC) {
if (*Name != '.')
SearchFile(FileName, File, Strings);
}
else if(strcmpi(Name,FileName))
Strings->Add(File);
}while(findnext(&blk)==0);
findclose(&blk); /* 有些编译器没有findclose,这行去掉 */
}
TStringList* SearchFile(const char* FileName)
{
char buf[128];
TStringList* Strings;
Strings = new TStringList;
GetLogicalDriveStrings(128, buf);
for(char* s=buf; *s!=0; s+=strlen(s)+1) {
SearchFile(FileName, s, Strings);
}
return Strings;
} 我原来写过的一个程序中的代码: void __fastcall SearchTxtDocFile::Execute()
{
DWORD AllDrives=GetLogicalDrives();
if (AllDrives==0)
return;
AnsiString Dir;
char d;
for(int i=2; i<26; i++)
{
if (AllDrives & (1<先取的所有盘,然后遍历
- 刚学BCB时写过,你在#codego.net#的软件里找“文件遍历”,有源码
- 29、C++内存分配函数Malloca/alloca:
1、在调用alloca的函数返回的时候,它分配的内存会自动释放。也就是说,用alloca分配的内存在栈上。所以释放不需要用户使用free。
2、alloca不具可移植性,而且在没有传统堆栈的机器上很难实现。当它的返回值直接传入另一个函数时会带来问题,因为他分配在栈上。
总结:由于这些原因,alloca不宜使用在必须广泛移植的程序中,不管它可能多么有用。
Realloca:
重新分配内存并返回void类型,如果没有足够的内存扩展内存块,则原来的指向的内存指针无变化,并返回NULL;如果重新分配大小设为0,而释放原来的内存块,并返回NULL。
Calloc:
分配指定数目的元素,每个元素的大小由size指定,并将其初始化为0,calloc调用malloc使用C++_set_new_mode函数来设置新的处理方式,默认情况下,malloc失败时不调用分配内存的处理程序例程。
Malloc:
从堆上分配指定大小的字节数并返回void类型,如分配失败则返回NULL,malloc分配的字节数可能比指定的字节要多,这是由内存对奇方式决定的,malloc实际上调用了HeapAlloc函数,因此malloc分配的内存也不能跨进程调用。
New:
分配内存的对象或数组类型的对象和返回一个适当类型,并调用对象的构造函数及在delete时调用对象的析构函数。其实现基于malloc调用。
下面是windows系统提供的API函数:
1、VirtualAlloc/VirtualAllocaEx
在虚拟地址空间中保留或提交内存,每次操作大小为Page页大小的整数倍,因此需要自己计算内存分配算法,在没有使用MEM_RESET的情况下会初始化内存块(0),VirtualAllocEx还可以在其他进程中的保留内存操作,并使用其对于的VirtualFree/VirtualFreeEx释放内存。
2.HeapAlloc/HeapFree
在指定的Heap中分配内存,heap应该由CreateHeap或GetProcessHeap返回,分配的内存不能移动,CreateHeap创建的堆只能在调用的进程中使用,因此如需跨进程滴啊用不能使用此种分配方式,由HeapFree释放。
3、GlobalAlloc/GlobalFree
从全局堆分配指定字节的内存,分配的内存可跨进程访问,并使用8字节对齐方式,有GloabalFree释放,在使用GlobalAlloc分配的内存块时需调用GlobalLock和GlobalUnlock函数。
PS:为了更好的理解内存分配,我们可以了解一下内存分区。
1)、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式