2017-12-01 1 views
0

Ich habe einen Dialog, der eine Fortschrittsleiste hat. Ich möchte eine Methode zu diesem Dialog hinzufügen, die den Fortschrittsbalken auf das Auswahlrechteck setzt. Ich versuche folgendes:Statusleiste von Normal zu Laufschrift wechseln

void CDownloader::SetIntermediate(wstring info) 
{ 
    SetDlgItemText(IDC_DOWNLOADER_LABEL, info.c_str()); 

    auto style = GetWindowLong(GWL_STYLE); 
    style &= ~(PBS_SMOOTH | PBS_SMOOTHREVERSE | PBS_VERTICAL); 
    style |= PBS_MARQUEE; 
    SetWindowLong(GWL_STYLE, style); 

    RECT windowRect; 
    GetWindowRect(&windowRect); 
    SetWindowPos(HWND_TOP, &windowRect,SWP_FRAMECHANGED); 

    HWND progress = GetDlgItem(IDC_DOWNLOADER_PROGRESS); 
    ::SendMessage(progress, PBM_SETMARQUEE, TRUE, 100); 
} 

Allerdings funktioniert das nicht :(

ich die Fenster-Stil gesetzt Entfernen Stile Marquee, die mit ihm in Konflikt geraten kann, SetWindowPos mit dem Stil zu aktualisieren und die den Fortschritt auf . MARQUEE

kann ich die Fortschrittsbalken im Designer auf Marquee, kann aber nicht bac normal wechseln

+0

Die Verwendung von SetWindowLong() zum Ändern von Style-Flags ist ein Treffer und Miss, insbesondere Progressbar gewinnt keine Preise. Die einfache Problemumgehung besteht darin, * zwei * von ihnen zu erstellen und einen davon basierend auf dem, was der Benutzer sehen soll, sichtbar zu machen. Oder einfach nur DestroyWindow + CreateWindowEx. –

+0

Dann sollten Sie Code schreiben, um Fortschrittsbalken in Normal zu verwandeln. Das ist 'PBS_MARQUEE'-Stil entfernen,' PBS_SMOOTH' zurücksetzen und so weiter. – VTT

+1

Sie legen die Fortschrittsbalken-Stile im * -Dialog * anstelle des Fortschrittsbalkens fest. Es sollte ':: GetWindowLong (progress, GWL_STYLE)' und ':: SetWindowLong (progress, GWL_STYLE, style);' sein. Ich glaube auch nicht, dass Sie die 'SetWindowPos' brauchen. – zett42

Antwort

1

Für alle, die den richtigen Code whant.

void CDownloader::SetPending(bool value) 
{ 
    if(value) 
    { 
     HWND progress = GetDlgItem(IDC_DOWNLOADER_PROGRESS); 
     auto style = ::GetWindowLong(progress, GWL_STYLE); 
     style |= PBS_MARQUEE; 
     ::SetWindowLong(progress, GWL_STYLE, style); 
     ::SendMessage(progress, PBM_SETMARQUEE, TRUE,0); 
    } 
    else 
    { 
     HWND progress = GetDlgItem(IDC_DOWNLOADER_PROGRESS); 
     auto style = ::GetWindowLong(progress, GWL_STYLE); 
     style &= ~PBS_MARQUEE; 
     ::SetWindowLong(progress, GWL_STYLE, style); 
     ::SendMessage(progress, PBM_SETMARQUEE, FALSE,0); 
    } 
}