線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1571
推到 Plurk!
推到 Facebook!

請問如何動態activate子視窗?

尚未結案
cc12345
一般會員


發表:32
回覆:35
積分:13
註冊:2005-01-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-01 12:42:48 IP:61.219.xxx.xxx 未訂閱
大家好. 線再我有一個main window, 內有兩個子視窗a and b, 想請問如何在main裡頭動態Aactivate某一個子視窗? 以下的code似乎沒有作用... HANDLE hWnd = a->Handle; SetActiveWindow( hWnd ); 謝謝.
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-01 13:21:21 IP:219.137.xxx.xxx 未訂閱
cc12345 您好: SetActiveWindow() 的參數是 HWND,a->Handle 好像是不行的,用 a->SetFocus(); 可以達到您的需求嗎?
Fm
初階會員


發表:19
回覆:66
積分:37
註冊:2003-10-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-03 16:23:38 IP:61.62.xxx.xxx 未訂閱
 
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-06 10:54:02 IP:61.219.xxx.xxx 未訂閱
謝謝兩位!!    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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-06 16:00:07 IP:218.19.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-06 18:31:53 IP:61.219.xxx.xxx 未訂閱
謝謝 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
系統時間:2024-03-28 19:28:33
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!