Χωρίς Τίτλο

Ηθελα πριν λίγο καιρό σε μια εφαρμογούλα να τροποποιήσω λίγο το κεντρικό παράθυρο, ώστε να να μην έχει τίτλο και να πιάνει ολόκληρη την οθόνη. Οσοι έχουν δουλέψει με το Adobe Photoshop, είναι αυτό που κάνει το Full Screen with menu bar. Είχα διαβάσει παλιότερα κάτι αντίστοιχο αν όχι το ίδιο από τον Paul DiLascia όταν έγραφε άρθρα στο MSJ, πριν καμιά δεκαετία, και ήρθε η ώρα να ξεθάψω μνήμες.

Χωρίς πολλά λόγια το αποτέλεσμα είναι το ακόλουθο:

__declspec(dllexport) void __stdcall ShowTitleBar(HWND *phWnd)
{
    LONG dwStyle = GetWindowLong(*phWnd, GWL_STYLE);
    dwStyle |= WS_CAPTION;
    SetWindowLong(*phWnd, GWL_STYLE, dwStyle);
    SetWindowPos(*phWnd, NULL, 0, 0, 0, 0,
            SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|
            SWP_DRAWFRAME);
}

__declspec(dllexport) void __stdcall HideTitleBar(HWND *phWnd)
{
    LONG dwStyle = GetWindowLong(*phWnd, GWL_STYLE);
    dwStyle &= ~WS_CAPTION;
    SetWindowLong(*phWnd, GWL_STYLE, dwStyle);
    SetWindowPos(*phWnd, NULL, 0, 0, 0, 0,
            SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|
            SWP_DRAWFRAME);
}

Βέβαια για το συγκεκριμένο project ο κώδικας θα χρησιμοποιηθεί στην Access και μιας και θα το έφτιαχνα που θα το έφτιαχνα, το καλύτερο θα ήταν να γίνει ένα dll που να εξάγει τις functions που να παρέχουν τη λειτουργικότητα χωρίς πολλές δηλώσεις και πολλές λεπτομέρειες να με απασχολούν. Το μόνο που έπρεπε να γίνει από τη μεριά της Access (και οποιασδήποτε VBA capable εφαρμογής) είναι να γίνουν οι δηλώσεις:

Private Declare Sub ShowTitleBar Lib "C:PROGtitleBar.dll" (hWnd As Long)
Private Declare Sub HideTitleBar Lib "C:PROGtitleBar.dll" (hWnd As Long)

και να χρησιμοποιηθούν από τον κώδικα. Π.χ.

Private Sub HideTitle_Click()
    HideTitleBar Application.hWndAccessApp
End Sub

Private Sub ShowTitle_Click()
    ShowTitleBar Application.hWndAccessApp
End Sub

H όλη ιστορία είναι να μεταβληθεί το στύλ του παραθύρου της εφαρμογής αφαιρώντας/προσθέτοντας το WS_CAPTION. Αλλά δεν αρκεί αυτό. Πρέπει μετά το παράθυρο να ξαναζωγραφίσει το περιθώριο του ώστε να γίνη ορατή η αλλαγή. Τέλος, αφού φτιάχτηκε ο κώδικας μια φορά γιατί να χρησιμοποιηθεί μόνο από τη C++ αφού μπορεί να χρησιμοποιηθεί και από άλλες γλώσσες και εφαρμογές με τις λιγότερες δυνατές προσθήκες;

Ισως αν δω ότι είναι πιο εύχρηστο να γίνει αργότερα και αυτό ένα COM object αντί απλού DLL. Ο κώδικας άλλωστε είναι για να ξαναχρησιμοποιείται.

Κατεβάστε τα αρχεία σε zip μορφή (το dll με τα assebly sources και μια δοκιμαστική βάση σε access). Ο κώδικας υποθέτει ότι τα αρχεία βρίσκονται όλα στον κατάλογο C:Prog