cc12345
一般會員
發表:32 回覆:35 積分:13 註冊:2005-01-24
發送簡訊給我
|
大家好. 線再我有一個main window, 內有兩個子視窗a and b, 想請問如何在main裡頭動態Aactivate某一個子視窗?
以下的code似乎沒有作用... HANDLE hWnd = a->Handle;
SetActiveWindow( hWnd ); 謝謝.
|
RedSnow
版主
發表:79 回覆:1322 積分:845 註冊:2003-12-15
發送簡訊給我
|
cc12345 您好: SetActiveWindow() 的參數是 HWND,a->Handle 好像是不行的,用 a->SetFocus(); 可以達到您的需求嗎?
|
Fm
初階會員
發表:19 回覆:66 積分:37 註冊:2003-10-15
發送簡訊給我
|
cc12345 你好:
不是很瞭解你的含意,但是我小改了你提供的API,他是可以work的阿
//------------------------------------------------------------------
#include
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
//-------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//-------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender)
{
TForm2* pForm2=new TForm2(Application);
Form2=pForm2;
Form2->Show();
}
//------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender)
{
TForm3* pForm3=new TForm3(Application);
Form3=pForm3;
Form3->Show();
}
//-------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
HANDLE hWnd = Form2->Handle;
SetActiveWindow( hWnd );
}
//-------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
HANDLE hWnd = Form3->Handle;
SetActiveWindow( hWnd );
}
//-------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Close();
}
//-------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
HANDLE hWnd2 = Form2->Handle;
SetActiveWindow( hWnd2 );
WaitForSingleObject(hForm[0],5000);
Memo1->Lines->Add("Form2 Active");
Sleep(500);//To clear
HANDLE hWnd3 = Form3->Handle;
SetActiveWindow( hWnd3 );
WaitForSingleObject(hForm[1],5000);
Memo1->Lines->Add("Form3 Active");
}
//------------------------------------------------------------------- void __fastcall TForm1::Button6Click(TObject *Sender)
{
Timer1->Enabled=true;
}
//-------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Memo1->Clear();
for(int i=0;i<2;i )
hForm[i]=CreateEvent(NULL,FALSE,FALSE,NULL);
}
//------------------------------------------------------------------ void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
for(int i=0;i<2;i )
CloseHandle(hForm[i]);
}
//-------------------------------------------------------------------
***************************************** #include "Unit2.h"
//-------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
extern HANDLE hForm[2];
//-------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//------------------------------------------------------------------- void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
Action=caFree;
}
//------------------------------------------------------------------- void __fastcall TForm2::FormActivate(TObject *Sender)
{
SetEvent(hForm[0]);
}
//------------------------------------------------------------------- ************************************************
#include
#pragma hdrstop #include "Unit3.h"
//-------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
extern HANDLE hForm[2];
//-------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}
//------------------------------------------------------------------- void __fastcall TForm3::FormClose(TObject *Sender, TCloseAction &Action)
{
Action=caFree;
}
//------------------------------------------------------------------- void __fastcall TForm3::FormActivate(TObject *Sender)
{
SetEvent(hForm[1]);
}
//-------------------------------------------------------------------
/*青青子矜,悠悠我心。
但為君故,沈吟至今。*/
|
cc12345
一般會員
發表:32 回覆:35 積分:13 註冊:2005-01-24
發送簡訊給我
|
謝謝兩位!! 1. 用SetFocus()不行
2. 我試了Fm兄的方法, 發現在動態new的Form的狀況下, 是可以work的,
不過我的程式是MDI Application,child window都是auto-create, 卻不work了,
不知是否有其他的方法?
小弟有想過用SendMessage, 不過實在是看不懂SendMessage要如何使用? 謝謝 引言:
cc12345 你好:
不是很瞭解你的含意,但是我小改了你提供的API,他是可以work的阿
//------------------------------------------------------------------
#include
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
//-------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//-------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender)
{
TForm2* pForm2=new TForm2(Application);
Form2=pForm2;
Form2->Show();
}
//------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender)
{
TForm3* pForm3=new TForm3(Application);
Form3=pForm3;
Form3->Show();
}
//-------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
HANDLE hWnd = Form2->Handle;
SetActiveWindow( hWnd );
}
//-------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
HANDLE hWnd = Form3->Handle;
SetActiveWindow( hWnd );
}
//-------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Close();
}
//-------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
HANDLE hWnd2 = Form2->Handle;
SetActiveWindow( hWnd2 );
WaitForSingleObject(hForm[0],5000);
Memo1->Lines->Add("Form2 Active");
Sleep(500);//To clear
HANDLE hWnd3 = Form3->Handle;
SetActiveWindow( hWnd3 );
WaitForSingleObject(hForm[1],5000);
Memo1->Lines->Add("Form3 Active");
}
//------------------------------------------------------------------- void __fastcall TForm1::Button6Click(TObject *Sender)
{
Timer1->Enabled=true;
}
//-------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Memo1->Clear();
for(int i=0;i<2;i )
hForm[i]=CreateEvent(NULL,FALSE,FALSE,NULL);
}
//------------------------------------------------------------------ void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
for(int i=0;i<2;i )
CloseHandle(hForm[i]);
}
//-------------------------------------------------------------------
***************************************** #include "Unit2.h"
//-------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
extern HANDLE hForm[2];
//-------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//------------------------------------------------------------------- void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
Action=caFree;
}
//------------------------------------------------------------------- void __fastcall TForm2::FormActivate(TObject *Sender)
{
SetEvent(hForm[0]);
}
//------------------------------------------------------------------- ************************************************
#include
#pragma hdrstop #include "Unit3.h"
//-------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
extern HANDLE hForm[2];
//-------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}
//------------------------------------------------------------------- void __fastcall TForm3::FormClose(TObject *Sender, TCloseAction &Action)
{
Action=caFree;
}
//------------------------------------------------------------------- void __fastcall TForm3::FormActivate(TObject *Sender)
{
SetEvent(hForm[1]);
}
//-------------------------------------------------------------------
/*青青子矜,悠悠我心。
但為君故,沈吟至今。*/
|
RedSnow
版主
發表:79 回覆:1322 積分:845 註冊:2003-12-15
發送簡訊給我
|
cc12345 您好: 我對前文作個說明,您在一開始時並未說明使用的是 MDI 視窗,我在 SDI 視窗裡動態開啟兩個子視窗後,使用 SetFocus() 是可行的,另外我先前對 SetActiveWindow() 的 "HWND 與 Handle 不同" 這個認知是錯誤的,後來我試過直接將上述例子中的 Handle 值代入 SetActiveWindow() 是一樣可以運作的,在此作個更正。 既然您使用的是 MDI 視窗,那麼您可以使用 MDIChildren[index] 去取得 Child 視窗,然後使用 BringToFront() 將指定的子視窗移到前景來 ( 如果這是您要的動作),只不過 MDIChild 的索引值似乎會變動,若要讓特定的 Child 視窗做指定動作的話,可能需要加上其它的 "對照" 動作,例如透過 Name 或是 Tag,以下我以 Tag 為例作個說明:
1. 使用 BCB 的 MDIForm 樣版產生一個 Project。 2. 在新增 Child 視窗的地方為每個 Child 視窗的 Tag 屬性加上識別數字:
void __fastcall TMainForm::CreateMDIChild(String Name)
{
TMDIChild *Child; //--- create a new MDI child window ----
Child = new TMDIChild(Application);
Child->Caption = Name;
if (FileExists (Name))
Child->Memo1->Lines->LoadFromFile(Name);
Child->Tag = MDIChildCount; // 加上這行
}
此處僅做簡單的使用示範,未對刪除某些 Child 視窗後,使用 MDIChildCount 為 Tag 值是否會重覆做檢查?請自行處理。 3. 寫一個自定函數如下: void __fastcall TMainForm::ToFront(int index)
{
for(int i=0; iTag == index){
MDIChildren[i]->BringToFront();
break;
}
}
} 4. 設兩個 Button 作為測試之用,內容為呼叫自定函數將指定的 Child 視窗移到前景來: void __fastcall TMainForm::Button1Click(TObject *Sender)
{
ToFront(1);
} void __fastcall TMainForm::Button2Click(TObject *Sender)
{
ToFront(2);
}
測試程式時先按 "新增" 鈕兩次建立兩個新的 Child 視窗,然後點選 Button1 時,第一個子視窗會移到前景,點選 Button2 時,第二個子視窗會移到前景。 再次強調以上係使用 Tag 的範例僅供說明之用,未對各種狀況做深入考量,實際應用時最好加上相關的檢查與紀錄動作。 發表人 - RedSnow 於 2005/04/06 16:16:06
|
cc12345
一般會員
發表:32 回覆:35 積分:13 註冊:2005-01-24
發送簡訊給我
|
謝謝 RedSnow兄的詳細說明. 我參考您的作法, 將我的child window的pointer紀錄在main裡頭,
然後在各個按鈕的event handler直接呼叫pointer->BringToFront(), 已經可以了... 引言:
cc12345 您好: 我對前文作個說明,您在一開始時並未說明使用的是 MDI 視窗,我在 SDI 視窗裡動態開啟兩個子視窗後,使用 SetFocus() 是可行的,另外我先前對 SetActiveWindow() 的 "HWND 與 Handle 不同" 這個認知是錯誤的,後來我試過直接將上述例子中的 Handle 值代入 SetActiveWindow() 是一樣可以運作的,在此作個更正。 既然您使用的是 MDI 視窗,那麼您可以使用 MDIChildren[index] 去取得 Child 視窗,然後使用 BringToFront() 將指定的子視窗移到前景來 (如果這是您要的動作),只不過 MDIChild 的索引值似乎會變動,若要讓特定的 Child 視窗做指定動作的話,可能需要加上其它的 "對照" 動作,例如透過 Name 或是 Tag,以下我以 Tag 為例作個說明:
1. 使用 BCB 的 MDIForm 樣版產生一個 Project。 2. 在新增 Child 視窗的地方為每個 Child 視窗的 Tag 屬性加上識別數字:
void __fastcall TMainForm::CreateMDIChild(String Name)
{
TMDIChild *Child; //--- create a new MDI child window ----
Child = new TMDIChild(Application);
Child->Caption = Name;
if (FileExists (Name))
Child->Memo1->Lines->LoadFromFile(Name);
Child->Tag = MDIChildCount; // 加上這行
}
此處僅做簡單的使用示範,未對刪除某些 Child 視窗後,使用 MDIChildCount 為 Tag 值是否會重覆做檢查?請自行處理。 3. 寫一個自定函數如下: void __fastcall TMainForm::ToFront(int index)
{
for(int i=0; iTag == index){
MDIChildren[i]->BringToFront();
break;
}
}
} 4. 設兩個 Button 作為測試之用,內容為呼叫自定函數將指定的 Child 視窗移到前景來: void __fastcall TMainForm::Button1Click(TObject *Sender)
{
ToFront(1);
} void __fastcall TMainForm::Button2Click(TObject *Sender)
{
ToFront(2);
}
測試程式時先按 "新增" 鈕兩次建立兩個新的 Child 視窗,然後點選 Button1 時,第一個子視窗會移到前景,點選 Button2 時,第二個子視窗會移到前景。 再次強調以上係使用 Tag 的範例僅供說明之用,未對各種狀況做深入考量,實際應用時最好加上相關的檢查與紀錄動作。 發表人 - RedSnow 於 2005/04/06 16:16:06
|