|
|
 |
发送电子邮件 |
热 ★★★★ |
|
发送电子邮件 |
|
作者:闵涛 文章来源:闵涛的学习笔记 点击数:2829 更新时间:2009/4/23 18:35:31  |
|
|
其为-1时表示第二个域起作用。第二个域用字符串表示进度信息,其格式为<String><:><Value>,比如:RecordsCopied:125 本文主要在回调函数中完成两个工作: 1)显示数据拷贝(BatchMove)进度 2)提供让用户终止长时间拷贝的机制 显示拷贝进度的代码如下: CBRType__stdcallApiCallBackFun( CBTypeecbType, //Callbacktype Int iClientData, //Clientcallbackdata void*pCbInfo //Callbackinfo/Client ) { AnsiString str; if(ecbType==cbGENPROGRESS){ intj=StrToInt(((CBPROGRESSDesc*)pCbInfo)->iPercentDone); if(j<0) { //如果iPercentDone为-1,则分析szMsg的信息 str=((CBPROGRESSDesc*)pCbInfo)->szMsg;intpos=str.AnsiPos(":")+1; //提取出拷贝的记录数 //下面的代码用来在一个Form中显示拷贝进度及拷贝数量Form1->Label2->Caption=str.SubString(pos,100); Form1->Label2->Update(); Form1->ProgressBar1->Position=int((str.SubString(pos,100).ToDouble()/Form1->TransNum)*100); Form1->ProgressBar1->Update(); }else{ Form1->ProgressBar1->Position=j;Form1->ProgressBar1->Update(); } return cbrCONTINUE; //必须返回cbrCONTINUE以便让BatchMove继续,若返回cbrABORT则终止拷贝 } } 一切完成以后,每当调用长时间BDE操作(比如BatchMove1->Exectue())时都会触发该回调函数,注意在不需要时应"注销"这个回调函数。 如果批量传送数据时间很长,则必须为用户提供终止该操作的机会,前面提到,若回调函数返回cbrABORT,则BatchMove过程立即终止。可以在Form上加上一个"停止"按钮和一个全局布尔变量isContinue,当开始拷贝时设该变量为true,当按钮按下后,设该变量为false,每次调用回调函数时检查isContinue的值,若为true则回调函数返回cbrCONTINUE让拷贝继续,否则返回cbrABORT终止拷贝。但是问题在于一旦拷贝过程开始,该进程内所有消息将被阻塞,应用程序在拷贝结束之前没有机会响应键盘、鼠标等一切消息,连屏幕刷新都不能完成,因此必须找到一种避免消息阻塞的方法。 大家知道,Windows是靠事件(消息)驱动的,在WIN32系统中有两种消息队列:系统队列和应用程序队列,当一个程序进行一个长时间操作时,系统分配给该程序的时间片将完全用于处理该操作,换句话说,应用程序没有从它的应用程序队列中取出消息并处理的机会,这样该程序将停止一切对外部事件的响应直到该操作完成为止。具体到本文中就是程序必须等到BatchMove1->Execute()执行完毕后才能响应用户操作,因此用户将完全没有机会终止拷贝过程。 解决的办法是:在回调函数中取出消息队列中的消息,并后台处理它们,这样用户将有机会按下终止按钮。实现的代码很简单,在回调函数中最后加入以下代码即可 CBRType__stdcallApiCallBackFun(…){ ……MSGamsg; while(PeekMessage(&amsg,NULL,0,0,PM_REMOVE)) {//从队列中取消息 TranslateMessage(&amsg);//翻译消息 DispatchMessage(&amsg);//分发消息 } if(isContinue) return cbrCONTINUE; else returncbrABORT; }
软件封面的实现
1.先设置两个窗体Form1 Form2其中Form1为主窗体,Form2为动态调用窗体 在工程文件Project1.cpp中加入如下代码: #include <vcl.h> #include "Unit2.h" #pragma hdrstop
USERES("Project1.res"); USEFORM("Unit1.cpp", Form1); USEFORM("Unit2.cpp", Form2); //--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try{ Application->Initialize(); Form2 = new TForm2(Application); Form2->Show(); Form2->Update(); Application->CreateForm(__classid(TForm1), &Form1); delete Form2; Application->Run(); } catch (Exception &exception){ Application->ShowException(&exception); } return 0; } 2.然后在主窗体unit1.cpp中加入下面代码: void __fastcall TForm1::FormCreate(TObject *Sender) { unsigned long CurTime; unsigned long DelayTime; // 设置延迟时间为5秒 DelayTime = 5000; CurTime = GetTickCount(); // 在这儿可以加上应用程序的初始化过程 unsigned long Inter; do{ Inter = GetTickCount()-CurTime; Form2->ProgressBar1->Position = Inter*100.0/DelayTime; } while( Inter<DelayTime ); }
在BCB中显示2000新式对话框
我自己测试了一下,在2000和xp下能显示新式对话框,不过不能使用bcb中的组件,只能自己调用api函数,再一次说明了api函数的强大.我的程序如下,希望大家指教. //main.h //--------------------------------------------------------------------------- #ifndef mainH #define mainH //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <Dialogs.hpp> #include <ExtCtrls.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; TPanel *Panel1; TMemo *Memo1; TPanel *Panel2; TGroupBox *GroupBox1; TCheckBox *CheckBox1; TButton *Button2; void __fastcall Button1Click(TObject *Sender); void __fastcall FormCreate(TObject *Sender); void __fastcall FormDestroy(TObject *Sender); void __fastcall Button2Click(TObject *Sender); void __fastcall CheckBox1Click(TObject *Sender); private: // User declarations public: // User declarations LPOPENFILENAMEA pOpenFile; BYTE *pBuf; __fastcall TForm1(TComponent* Owner); void __fastcall DisplayInMemo(String str); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif //main.c //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "main.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { String str; BOOL bReturn = GetOpenFileName(pOpenFile); if(bReturn) { str.sprintf("您选择的文件为%s",pOpenFile->lpstrFile); DisplayInMemo(str); }else{ str.sprintf("您没有选择的文件"); DisplayInMemo(str); } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { String str; pBuf =(BYTE *)malloc(1024); memset(pBuf,0,1024); pBuf = "*.txt"; pOpenFile = (LPOPENFILENAMEA)malloc(sizeof(OPENFILENAMEA)); memset(pOpenFile,0,sizeof(OPENFILENAMEA)); pOpenFile->lStructSize = sizeof(OPENFILENAMEA); pOpenFile->hwndOwner = Handle; pOpenFile->hInstance = HInstance; pOpenFile->lpstrFilter = "文本文件(*.txt)"; pOpenFile->nFilterIndex = 0; pOpenFile->nMaxFile = 255; pOpenFile->Flags = OFN_EXPLORER; pOpenFile->lpstrFile = pBuf; pOpenFile->lpstrTitle = "我的文件对话框"; pOpenFile->lpstrInitialDir = ".\\"; //pOpenFile-> str.sprintf("显示2000样式对话框演示"); DisplayInMemo(str); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { free((void *)pOpenFile); } //--------------------------------------------------------------------------- void __fastcall TForm1::DisplayInMemo(String str) { if(Memo1->Lines->Count > 100){ Memo1->Lines->Clear(); } Memo1->Text = str + char(13) + char(10) + Memo1->Text; } void __fastcall TForm1::Button2Click(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- void __fastcall TForm1::CheckBox1Click(TObject *Sender) { if(CheckBox1->Checked){ pOpenFile->Flags |= OFN_READONLY; }else{ pOpenFile->Flags &= !OFN_READONLY; } } //--------------------------------------------------------------------------- 在bcb5测试通过.
如何屏蔽系统ALT+F4
第一步:在你的密码窗口的头文件的 public部分加上以下两段代码: //这是自定义响应消息的函数: void __fastcall OnCloseForm(TMessage Message); //定义一个消息域: BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, OnCloseForm) END_MESSAGE_MAP(TForm) 第二步:在密码窗口的代码中增加此函数的实现:(注 TfWelcome 是密码窗口的名字,改成你自己的密码窗口名称) void __fastcall TfWelcome::OnCloseForm(TMessage Message) { if(Message.WParam==SC_CLOSE){ //此消息拦截是为了防止用户关闭登录窗口 。 if(Application->MessageBox(" 您确实要关闭本系统?”。","金浪软件提醒",48|1)==1){ Application->Terminate();//如果用户选择“是”,就关闭整个程序。 } } } 说明:这样用户无论如何都关不了你的密码窗口了,要关就把整个程序关了。
调用API函数NetBios来获得网卡物理地址
本程序是调用API函数NetBios来获得网卡物理地址的。
//Get MAC Address //Proto: bool MAC(char *Mac); //return: true if success and Mac is MAC address, // false if fail. // bool MAC(char *Mac) { typedef struct _ASTAT_ { ADAPTER_STATUS adapt; NAME_BUFFER NameBuff [30]; }ASTAT, *PASTAT;
ASTAT Adapter;
NCB ncb; UCHAR uRetCode; char tmp[40]; Mac[0]=''''\0''''; memset( &ncb, 0, sizeof(ncb) ); ncb.ncb_command = NCBRESET; ncb.ncb_lana_num = 0; uRetCode = Netbios( &ncb ); if (uRetCode!=0) { strcat(Mac,"Init Error!"); return false; } memset(&ncb, 0, sizeof(ncb) ); ncb.ncb_command = NCBASTAT; ncb.ncb_lana_num = 0; strcpy((char *)ncb.ncb_callname, "* " );//这个"*"代表获上一页 [1] [2] [3] [4] 下一页 没有相关教程
|
|
| 教程录入:mintao 责任编辑:mintao |
|
|
上一篇教程: 开发一个基于DCOM的局域网聊天室(三) 下一篇教程: 增强MIDAS的安全性 |
|
|
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |
|
注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网] |
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| |
|
|
|
|
|
 |
同类栏目 |
 |
 |
赞助链接 |
 |
|
500 - 内部服务器错误。
|
|
|
|
|
|