益友软件工作室

加密金刚锁相关技术 → C++Builder类技术文章 → C++ Builder技巧集锦

C++ Builder技巧集锦

文章作者:佚名

调用DOS程序时不显示窗口

使 用 ShellExecute调 用 DOS程 序 时 可 以 不 显 示 窗 口 , 如 :

ShellExecute(0, "open", "c:\\tools\\arj.exe", "a c:\\p.arj c:\\*.bat c:\\*.sys", NULL, SW_HIDE);  

产生随机数代码

int SecVal;

AnsiString Hour,Minute,Second;

int RandomVal;

Hour=Now().FormatString("hh");

Minute=Now().FormatString("nn");

Second=Now().FormatString("ss");

SecVal=StrToInt(Hour)*3600+StrToInt(Minute)*60+StrToInt(Second);

for(int i=1;i<=SecVal;i++)

{

RandomVal=random(1000);

}

Form1->Caption=IntToStr(RandomVal);

得到文件版本的函数

AnsiString __fastcall TMainForm::returnversion( void )

{

int ii;

unsigned int jj = sizeof( VS_FIXEDFILEINFO );

char *pp, pp2[100];

AnsiString ss;

VS_FIXEDFILEINFO *aa;

void **pp1 = (void **)&aa;

pp2[0] = 0;

ss = "()";

ii = GetFileVersionInfoSize( Application->ExeName.c_str(), NULL );

if( ii != 0 ) {

pp = new char[ii];

if( GetFileVersionInfo( Application->ExeName.c_str(),

0, ii, pp ) ) {

if( VerQueryValue( pp, "\\", pp1, &jj ) ){

ss = " V";

ss += IntToStr( HIWORD(aa->dwFileVersionMS) )+".";

ss += IntToStr( LOWORD(aa->dwFileVersionMS) )+".";

ss += IntToStr( HIWORD(aa->dwFileVersionLS) )+"(build:";

ss += IntToStr( LOWORD(aa->dwFileVersionLS) )+")";

}

}

delete pp;

}

return ss;

}

得到正在运行的WINDOWS版本

WINDOWS版本多的很,你想这么多总是会存在着不兼容性,所以看看清它是什么有时会很重要!

加入下要的代码吧:

void __fastcall TForm1::FormCreate(TObject *Sender)

{

OSVERSIONINFO info ;

info.dwOSVersionInfoSize = sizeof (info) ;

GetVersionEx (&info) ;

switch (info.dwPlatformId)

{

case VER_PLATFORM_WIN32s:

Label1->Caption = "System: Windows Win 32s" ;

break ;

case VER_PLATFORM_WIN32_WINDOWS:

Label1->Caption = "System: Windows 95" ;

break ;

case VER_PLATFORM_WIN32_NT:

Label1->Caption = "System: Windows NT" ;

break ;

default:

Label1->Caption = "System: Unknown" ;

break ;

}

Label2->Caption = String ("Version: ")

+ String ((int) info.dwMajorVersion) + "." + String((int)info.dwMinorVersion) ;

Label3->Caption = String ("Build: ") + String ((int) (info.dwBuildNumber & 0xFFFF)) ;

Label4->Caption = String ("System Info: '") + info.szCSDVersion + "'" ;

}

让TRichEdit自动滚动

我们用TIMER加上对WINDOWS发消息就可以实现了!

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

SendMessage(RichEdit1->Handle, EM_SCROLL, SB_LINEDOWN, 0);

}

除了一行一行的向下滚还可以有什么效果呢?看看下面!

SB_LINEDOWN 向下一行

SB_LINEUP 向上一行

SB_PAGEDOWN 向下一页

SB_PAGEUP 向上一页

改一下就行了。

如何加入主页链接

你是不是有注意在一些软件中有一个htpp://www.XXX.com/一点就会在浏览器中自动打开这个主页。我们要如何实现这一步呢?简单的很看看下面!

在窗体上加入一个LABEL;

定义Label的CAPTION为“加密金刚锁主页”;

加入下面代码:

void __fastcall TForm2::Label1Click(TObject *Sender)

{

ShellExecute(Handle,"open","http/www.encrypter.net",0,0,SW_SHOW);

}

好了,你可以点了,当然你出入一些特效如Cursor变成手形就更好了!

如何检测本机是否与Internet连接

HRASCONN TMainForm::CheckForConnections()

{

char buff[256];

RASCONN rc;

rc.dwSize = sizeof(RASCONN);

DWORD numConns;

DWORD size = rc.dwSize;

// Enumerate the connections.

DWORD res = fRasEnumConnections(&rc, &size, &numConns);

if (!res && numConns == 0)

// No connections, return 0.

return 0;

if (res) {

// Error. Report it.

fRasGetErrorString(res, buff, sizeof(buff));

Memo1->Lines->Add(buff);

} else {

// Get the connection status.

RASCONNSTATUS status;

status.dwSize = sizeof(status);

res = fRasGetConnectStatus(rc.hrasconn, &status);

if (res) {

// Error. Report it.

fRasGetErrorString(res, buff, sizeof(buff));

Memo1->Lines->Add(buff);

return 0;

} else {

// Found connection, show details.

if (status.rasconnstate == RASCS_Connected) {

Memo1->Lines->Add("Existing connection found:");

Memo1->Lines->Add(" Device type: " +

String(rc.szDeviceType));

Memo1->Lines->Add(" Device name: " +

String(rc.szDeviceName));

Memo1->Lines->Add(" Connected to: " +

String(rc.szEntryName));

return rc.hrasconn;

} else {

// A connection was detected but its

// status is RASCS_Disconnected.

Memo1->Lines->Add("Connection Error");

return 0;

}

}

}

return 0;

}

如何显示和不显示鼠标

在超级解霸中我们以发现,在播放的时候MOUSE会自动消失,这样的效果有时真的有用,它是如何实现的。

在WINDOWS中API函数ShowCursor(bool bShow);是这个程序的主角。当bShow为true,Mouse出现,为false,MOUSE消失。下面我们来做一个单击窗体MOUSE消失,再击又出来的效果。

void __fastcall TForm1::FormClick(TObject *Sender)

{

if(i==1)

ShowCursor(false);

if(-i==1)

ShowCursor(true);

i=-i;

}

你可以跟据需要来做出各种效果!

如何显示透明图片

GIF是可以透明的,但是只能支持256色,BMP不支持透明但可以支持真彩,有没有方法可以实现BMP的透明呢?答案是肯定的。

我们点一个BUTTON是出现透明的图片画在FORM上的效果!

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Graphics::TBitmap *pBitmap=new Graphics::TBitmap();

pBitmap->LoadFromFile("test.bmp");//图片文件

pBitmap->Transparent = true; //设置透明属性为真

pBitmap->TransparentColor=clBlack;//设置透明色为黑色

pBitmap->TransparentMode = tmAuto;

Form1->Canvas->Draw(0,0,pBitmap);

delete pBitmap;

}

如何自己写代码遍历文件夹?

比如 遍历C:\winnt\ 下的所有文件夹,并把所有文件夹的名字写入到C:\folder.txt中去

void __fastcall TForm1::Button1Click(TObject *Sender)

{

TSearchRec sr;

TStringList* sss=new TStringList();

if (FindFirst("c:\\winnt", iAttributes, sr) == 0)

{

do

{

if ((sr.Attr & iAttributes) == sr.Attr)

{

sss->Add(sr.Name);

}

} while (FindNext(sr) == 0);

FindClose(sr);

}

sss->SaveToFile("c:\\folder.txt");

}

锁定鼠标

以下是锁定在Form中的例子,如果你想锁定你规定的区域,改变 R 即可。

譬如 R = Rect(0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));

锁定在Form中:

TRect R;

R = BoundsRect;

ClipCursor(&R);

解锁

TRect R;

R = Rect(0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));

ClipCursor(&R);

拖动一个无标题栏的窗体

在前面我们刚说了如何做一个不规则的窗体,这时我们会有一个新问题,不规则的窗体我们不能让标题栏还在上面,这样多不好看,那没有有标题栏我们如何来拖动这个窗体呢?下面我们先看看分析吧!

Windows分客户区和非客户区(标题栏、菜单、窗口框),我们只要在点下客户区时发出在非客户区标题栏的消息就能达到目的了。看看是如何做到的。

void __fastcall TForm1::CreateParams(TCreateParams &Params)

{

TForm::CreateParams(Params);

Params.Style &= ~WS_CAPTION;

}

void __fastcall TForm1::WMNCHitTest(TMessage &Msg)

{

if (GetAsyncKeyState(VK_LBUTTON)<0)

Msg.Result = HTCAPTION;

else

Msg.Result = HTCLIENT;

}

获取进程句柄后如何和窗口句柄相联系?

按钮按下调用函数CreateProcess(strFileName,NULL,NULL,NULL,FALSE,0,NULL,&StartupInfo,&ProcessInfo);

//ProcessInfo是一个全局变量,据此可获取进程句柄,进程ID,线程ID等

进程启动完毕,然后调用函数EnumWindows(EnumWindowsProc,0)

//EnumWindowsProc是回调函数

回调函数EnumWindowsProc为:

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lparam)

{

CString strPrompt;

DWORD ProcId;

DWORD ThreadId;

ThreadId=GetWindowThreadProcessId(hwnd,&ProcId)

if(ProcId==ProcessInfo.dwProcessId)

{

HWND targetWin;

targetWin=hwnd;

while(true)

{

HWND hTemp;

hTemp=GetParent(targetWin);

if(hTemp==NULL)

break;

else

targetWin=hTemp;

}

char szTemp[255];

sprintf(szTemp,"%x",ProcId);

CString strTemp=szTemp;

GetWindowText(targetWin,strTemp.GetBuffer(255),255);

return FALSE;

}

else

return true;

}

最小化和恢复程序的方法

1)

// To minimize, pass SC_MINIMIZE as the WPARAM

SendMessage(Application->Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);

// To restore, pass SC_RESTORE as the WPARAM

SendMessage(Application->Handle, WM_SYSCOMMAND, SC_RESTORE, 0);

2)

// To minimize, pass SW_MINIMIZE to ShowWindow

ShowWindow(Application->Handle, SW_MINIMIZE);

// To restore, pass SW_RESTORE to ShowWindow

ShowWindow(Application->Handle, SW_RESTORE);

3)

// To minimize the app, call Minimize

Application->Minimize();

// To restore the app, call Restore

Application->Restore();

个人看法,第一组方法最为灵活,可能用处比较的大,如果网友象再最小化窗口是搞出一些动画效果,那么用第二组函数,第三组没有什么特别的地方。

关闭外部应用程序

先利用FindWindow函数找出要关闭的应用程序的主窗口名字,然后发送一个消息即可。

实例如下:

HWnd HWndCalculator;

HWndCalculator = Winprocs->FindWindow(nil, "计算器"); // close the exist Calculator

if (HWndCalculator)

SendMessage(HWndCalculator, WM_CLOSE, 0, 0);

特别申明

本栏目的文章都是本人从网上搜集而来,仅供大家学习研究之用,请不要用于商业目的!其中署名“佚名”的,意思是作者不详。如果某些文章未署你的名字,请来信告知,我会补上的。如果你认为某些文章侵犯了你的正当权宜,也请来信,我会将它删除。