Seite 1 von 1

[solved] Aero Glass mit Win32Libs und der dwmapi.dll

Verfasst: Mittwoch 14. November 2007, 01:45
von nkoehring
Hallo...

Kurz und knapp:
Ich moechte - vollkommen win-vistaabhaengig, also mit den Win32-Libs fuer Python - folgendes Erscheinungsbild realisieren:

Bild


Weiß da jemand, ob das moeglich ist?

Verfasst: Mittwoch 14. November 2007, 08:43
von veers
Hm, vollkommen Vista unabhängig - Gtk + X11 mit Compiz - könnte ich dir wohl eine Lösung anbieten. Da habe ich mal so etwas gebastelt.

Verfasst: Mittwoch 14. November 2007, 16:36
von nkoehring
Hi Veers...

also allein aus Interesse wuerde ich mir diese Loesung schon gern mal anschauen :roll:

Um den Thread mal wiederzubeleben...

Verfasst: Dienstag 11. Dezember 2007, 16:16
von nkoehring
hab aus einem Beispiel heraus mal den Versuch gestartet die DWMAPI auf ein WindowsFenster anzusetzen... irgendwie funktioniert es leider nicht.

Hier erstmal n bissl Code:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import win32gui
import win32con
import win32api
import ctypes
import struct


class win32Window(object):
    def __init__(self):
        self.g_registeredClass = 0
        win32gui.InitCommonControls()
        self.message_map = {}
        self.hinst = win32api.GetModuleHandle(None)
    
    def _RegisterWndClass(self):
        className = "testApp"
        if not self.g_registeredClass:
            wc = win32gui.WNDCLASS()
            wc.SetDialogProc() # Make it a dialog class.
            self.hinst = wc.hInstance = win32api.GetModuleHandle(None)
            wc.lpszClassName = className
            wc.style = win32con.CS_VREDRAW | win32con.CS_HREDRAW
            wc.hCursor = win32gui.LoadCursor( 0, win32con.IDC_ARROW )
            wc.hbrBackground = win32con.COLOR_WINDOW + 1
            wc.lpfnWndProc = self.message_map # could also specify a wndproc.
            # C code: wc.cbWndExtra = DLGWINDOWEXTRA + sizeof(HBRUSH) + (sizeof(COLORREF));
            wc.cbWndExtra = win32con.DLGWINDOWEXTRA + struct.calcsize("Pi")
            icon_flags = win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE
            try:
                wc.hIcon = win32gui.LoadImage(self.hinst,
                    g_iconPathName,
                    win32con.IMAGE_ICON,
                    0,
                    0,
                    icon_flags
                )
            except:
                print "cannot find icon... using standard icon"
                wc.hIcon = win32gui.LoadIcon(0, win32con.IDI_APPLICATION)
            classAtom = win32gui.RegisterClass(wc)
            self.g_registeredClass = 1
        return className
        
    def _GetDialogTemplate(self, dlgClassName):
        style = win32con.WS_THICKFRAME | \
                    win32con.WS_POPUP | \
                    win32con.WS_VISIBLE | \
                    win32con.WS_CAPTION | \
                    win32con.WS_SYSMENU | \
                    win32con.DS_SETFONT | \
                    win32con.WS_MINIMIZEBOX
        cs = win32con.WS_CHILD | win32con.WS_VISIBLE
        title = "TestWindow"
        dlg = [ [title, (20, 20, 210, 250), style, None, (8, "MS Sans Serif"), None, dlgClassName], ]
        #self.hinst = win32api.GetModuleHandle(None)
        #win32gui.CreateDialogIndirect(hinst, dlg, 0, self.message_map)
        return dlg

    def DoModal(self):
        message_map = {
            win32con.WM_SIZE: self.OnSize,
            win32con.WM_INITDIALOG: self.OnInitDialog,
            win32con.WM_CLOSE: self.OnClose,
            win32con.WM_DESTROY: self.OnDestroy,
        }
        dlgClassName = self._RegisterWndClass()
        template = self._GetDialogTemplate(dlgClassName)
        
        return win32gui.DialogBoxIndirect(self.hinst, template, 0, message_map)
        
    def OnInitDialog(self, hwnd, msg, wparam, lparam):
        self.hwnd = hwnd
        
        # trying to usw dwmapi.dll to draw a glass client area
        margins = struct.pack("@iiii", 20, 20, 100, 20)
        dwmapi = ctypes.windll.LoadLibrary("dwmapi")
        dwmapi.DwmExtendFrameIntoClientArea(hwnd, margins)

    def OnClose(self, hwnd, msg, wparam, lparam):
        win32gui.EndDialog(hwnd, 0)

    def OnDestroy(self, hwnd, msg, wparam, lparam):
        print "Window destroyed..."
        win32gui.PostQuitMessage(0) # Terminate the app.

    def OnSize(self, hwnd, msg, wparam, lparam):
        x = win32api.LOWORD(lparam)
        y = win32api.HIWORD(lparam)
        return 1
        

if __name__ == '__main__':
    win = win32Window()
    win.DoModal()
...das ganze erzeugt zwar ein Fenster, aber der Bereich den ich angebe wird einfach nur weiß und nicht mit dem transparent/unscharf-Effekt belegt.

Hat wer ne Idee oder vielleicht ein besseres Beispiel wie man sowas macht - aber bitte nicht in C# - in dem moeglichst ohne Boardmittel der Sprache solche Fenster erzeugt werden, so dass ich es in Python nachbauen kann?

Verfasst: Dienstag 11. Dezember 2007, 16:41
von nkoehring
AH ES GEHT!!!

Hehe... hab doch noch ein Beispiel gefunden in dem es fuer C++ erklaert wurde. Es fehlte eine simple Funktion fuer win32con.WM_ERASEBKGND.
Eigentlich soll man darin Transparenz auf den DC zeichnen... aber es geht auch mit einem einfachen Return 1 ^^