Seite 2 von 2

Re: SetWindowTitle() verändert nicht die Taskleiste

Verfasst: 23.07.2005 10:55
von rolaf
Batze hat geschrieben:Wenn ich den Titel eines Fensters mit SetWindowTitle() ändere wir das bei mir in der Taskleiste der Titel nicht verändert. Ich brauch das aber für eine Vortschrittsanzeige.

Code: Alles auswählen

OpenWindow(0, 10, 10, 200, 100, #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "0% Fertig")

Repeat
  Delay(60)
  Prozent.f + 0.1
  SetWindowTitle(0, Str(Prozent) + "% Fertig" )
  Repeat
    Event = WindowEvent()
    If Event = #PB_Event_CloseWindow : Break 2 : EndIf
  Until Event = 0
Until Prozent => 100
Das hier ist natürlich nur ein Beispielcode. <)
Hallo,

also bei mir gehts einwandfrei.

> Win2000 SP4 und alle UpdatePacks von Winboard.org
> PureBasic 3.93

Verfasst: 23.07.2005 11:02
von DarkDragon
Leo hat geschrieben:Wenn schon

Code: Alles auswählen

hWnd = Window.Create(0, 0, 640, 480, "Titel");
weil Window ist ja kein Pointer auf ein Objekt, oder lieg ich da jetzt falsch?
Hmm... ich seh in Tutorials nur die Verwendung von Klassen mit -> aber nie mit .

Ist doch jetzt auch egal, aber das macht einfach die Verwendung leichter.

Verfasst: 23.07.2005 12:54
von pogi02

Code: Alles auswählen

OpenWindow(0, 10, 10, 200, 100, #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "0% Fertig")

Repeat
  Delay(60)
  Prozent.f + 0.1
  SetWindowTitle(0, Str(Prozent) + "% Fertig" )
  Repeat
    Event = WindowEvent()
    If Event = #PB_Event_CloseWindow : Break 2 : EndIf
  Until Event = 0
Until Prozent => 100 
In der Taskleiste wird es bei mir nur geschrieben wenn ich das Fenster verschiebe dann wird der aktuelle % wert angezeigt lass ich das Fenster wieder los zählen die % in der Titelleiste weiter, aber Taskleiste wieder nicht lol

Edit by Kiffi: Code-Tags gesetzt

Verfasst: 23.07.2005 13:41
von Zaphod
ganz einfach: MeinObjekt->MeineFunktion() bei dynamisch erstellten objekten, MeinObjekt.MeineFunktion() bei statisch erstellten objekten.

Verfasst: 23.07.2005 14:32
von Leo

Code: Alles auswählen

objekt *lala;
lala = new objekt;
lala->methode();

objekt lala;
objekt.methode();

Verfasst: 23.07.2005 16:38
von Ynnus
Mit dynamisch und statisch kann man es schon so sagen, trifft aber bei dir nur auf Objekte zu, einfacher wäre es sich so zu merken: (ok, schlecht ausgedrückt, will sagen, es geht nicht nur bei dynamischen Objekten sondern auch bei Strukturen usw...)

"->" ist ein Zeiger auf etwas.
Wenn also object.struktur->feld1 steht, dann ist in der Klasse keine wirkliche Struktur vorhanden sondern nur ein Pointer "Struktur" der auf eine Struktur zeigt, wir sprechen aber die Variable feld1 an. (Dadurch der Pfeil).
Der Punkt (.) kommt in allen anderen Fällen zum Einsatz, wenn man direkt eine Variable hat und keinen Pointer.

übrigens gibts dann auch noch den this pointer der immer auf das eigene Objekt zeigt. Daher wird man manchmal "this->" finden, wenn man das eigene Objekt ansprechen möchte, anstatt nur die Variablennamen des objekts zu nennen. Auch hier der Pfeil, weil auf Variablen zurückgegriffen werden sollen, die im Speicher durch einen Pointer gezeigt werden. (In diesem Fall pointet er auf unser Objekt)


So sieht dann meine Fensterklasse aus:

Code: Alles auswählen

class ctrl_window
{
    private:    MSG msg;
                WNDCLASS wndclass;
                HINSTANCE instance;
                HGLRC hrc;
                
                PAINTSTRUCT ps;
                SCROLLINFO scrollinfo_VERT;      //For Scrollbar Information
                SCROLLINFO scrollinfo_HORZ;      //For Scrollbar Information
                
                char* classname;                //important for tabcontrol
                

    protected:  HWND hwnd;
                HWND hwnd_toolbar;
                HWND parent;
                HDC hdc;
                HMENU h_menubar;

                int pos_x;
                int pos_y;
                int size_x;
                int size_y;

    public:     int create(HINSTANCE hinstance, MSG p_msg, WNDPROC wndproc, int pos_x, int pos_y, int size_x, int size_y, char* caption, HWND parent, int ex_style, int flags = WS_CAPTION | WS_OVERLAPPED | WS_SYSMENU );
                void set_text( char* text )     { SetWindowText(hwnd, text);}
                char* get_text( void );
                void destroy(bool flag);
                void enable( bool status)  {EnableWindow(hwnd, status);}
                void show( int status )   {ShowWindow(hwnd, status);}
                MSG get_msg( void )   {return msg;}
                bool get_message(HWND p_hwnd)  {GetMessage(&msg,p_hwnd,0,0);}
                bool translate_message( void )    {TranslateMessage(&msg);}
                LRESULT dispatch_message( void )    {return DispatchMessage(&msg);}
                void invalidate_window( int flags = RDW_NOCHILDREN | RDW_INVALIDATE);

                //OpenGL
                bool create_gl_rc( int size_x, int size_y, int typ);
                void resize_gl_rc( int size_x, int size_y, int typ);
                void delete_gl_rc( void );
                HGLRC get_hrc( void )   {return hrc;}

                //Scrollbar
                void sb_create(int typ, int min, int max, int pos);
                void sb_set_scrollrange(int typ, int min, int max);
                void sb_set_pos(int typ, int param);
                void sb_update( WPARAM wParam, LPARAM lParam, int direction );
                void sb_get_scrollinfo(int typ, SCROLLINFO& scrollstruct);
                int sb_get_scrollrange(int typ, bool flag);
                int sb_get_pos(int typ);

                //Toolbar
                bool tb_create( int style );
                bool tb_add_button(int command, char* bitmap_filename, int style = TBSTYLE_BUTTON);
                bool tb_add_std_button(int command, int std_ID, int style = TBSTYLE_BUTTON);
                void tb_delete_button(int command);
                void tb_enable_button(int command, bool status);
                bool tb_add_separator( void );
                int tb_get_button_state( int command );
                void tb_set_button_state( int command, int state);
                HWND get_hwnd_toolbar() {return hwnd_toolbar;}

                void begin_paint( void );
                void end_paint( void );
                
                int get_size_x( void );
                int get_size_y( void );
                void set_size( int size_x, int size_y);

                void set_hdc( HDC p_hdc ) {hdc = p_hdc;}
                HWND get_hwnd() {return hwnd;}
                HINSTANCE get_instance() {return (HINSTANCE) wndclass.hInstance;}
                HDC get_hdc( void )  {return hdc;}
                char* get_classname( void ) {return classname;}
                PAINTSTRUCT get_paintstruct ( void )    {return ps;}
};
(Die Fensterklasse ist in ständiger änderung oder überarbeitung und kein Endprodukt)

Wie man sieht, werden auch Dinge wie das Fensterhandle intern weggespeichert. Das kann man mit Methoden wie window.get_hwnd() bekommen. Außerdem kann man mit einfachen Methoden einen OpenGL-Rendercontext erzeugen. Ebenso kann man so Toolbars und Scrollleisten hinzufügen.
Von dieser Klasse werden alle meine Buttons abgeleitet, auch wenn es meist nicht sinnvoll wäre, ich weiß...
ömm, aber so ne frage:
wiso machst du das "schwierig", wenns auch "einfach" geht?
ich würde jetzt keine fenster mittels der api create window öffnen, aber warum machst du das?
hat das einen vorteil?
Der Vorteil ist, dass es objektorientiert ist und demnach leichter zu handhaben. Wo Purebasic sowas schreibt:

Code: Alles auswählen

SelectElement(liste(), element)
schreibe ich:
liste.select_element(element);
Es besteht also schon im Befehl die direkte Verknüpfung zum Objekt, zur Liste in diesem Fall. Nicht ein Befehl wo man die Liste einsetzt, sondern jede Liste hat diesen Befehl den man in Verbindung mit ihr nur aufrufen muss.

Anderes Beispiel:

Man hat ein Fenster "mainwindow" und möchte dazu Scrollleisten erstellen: Bei mir so möglich:

Code: Alles auswählen

    mainwindow.sb_create(SB_HORZ, 0, 100, 0);
    mainwindow.sb_create(SB_VERT, 0, 100, 0);
Damit werden dem Mainwindow-Fenster 2 Scrollleisten hinzugefügt welche von 0 - 100 bei Position 0 starten. (Siehe wieder die direkte Verknüpfung des Fensters schon im Namen vor dem Punkt).

Ein weiterer Punkt, warum ich das so mache ist, dass es nicht anders geht.^^ C++ bietet keine Befehle für GUI-Anwendungen, man muss sich seine Fenster selbst basteln, etwa aus der WinAPI. Daher habe ich die wichtigsten Funktionen zum Erstellen von Fenstern in Klassen gelegt und kann so nun einfach darauf zugreifen.