[PythonCE] Getting Started with Python on Mobile windows 2003

Edward Fewell EdwardFewell at hotmail.com
Mon Sep 19 20:58:58 CEST 2005


<< There is a win32gui module, which exposes the Mobile windows API. >>

There should also be a win32api module and win32con module. I don't have
those in my installation, and haven't had luck finding them.  win32con is
just a collection of constants, so the desktop version would be very, very
close with a few tweaks.  And we can skip using win32api for a simple demo.

There's a bigger problem in that win32gui isn't working (or at least the
version I have).  And it's also incomplete (even the desktop version is
missing some of the APIs).

Below is a sample that should create a window.  You can run it on a desktop,
and it correctly creates the window.  The print messages show up in the
console window confirming that the message pump is hooked in and getting the
WM_PAINT messages.  Sadly, that's where I wanted to put code to put text on
the window, but DrawText() isn't implemented in win32gui.

Also the WM_DESTROY message happens, I manually issue a quit message, the
gui window closes, but the console window stays open.  We never return from
the message pump.

Under CE, I see all those problems plus an issue that CE never paints the
window background.  Also it leaves the hourglass cursor up.  I do get a
window, and can drag it around by the title bar.  I can even see that it is
getting Windows messages.  But it's just not getting redrawn, so it's not
very useful yet.  

------------------------------------------------------------------------

import struct
#import win32api
#import win32con
import win32gui
import os

# Defines taken from desktop win32con.py
class win32con:
    CS_VREDRAW          = 1
    CS_HREDRAW          = 2
    IDC_ARROW           = 32512
    COLOR_WINDOW        = 5
    IDI_APPLICATION     = 32512
    DLGWINDOWEXTRA      = 32
    WS_OVERLAPPED       = 0
    WS_VISIBLE          = 268435456
    WS_CAPTION          = 12582912
    WS_SYSMENU          = 524288
    WS_THICKFRAME       = 262144
    WS_MINIMIZEBOX      = 131072
    WS_MAXIMIZEBOX      = 65536
    WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED   | \
                           WS_CAPTION      | \
                           WS_SYSMENU      | \
                           WS_THICKFRAME   | \
                           WS_MINIMIZEBOX  | \
                           WS_MAXIMIZEBOX)
    CW_USEDEFAULT       = -2147483648
    GWL_WNDPROC         = -4
    SW_SHOW             = 5
    WM_PAINT            = 0x000F
    WM_DESTROY          = 0x0002
    MB_OK               = 0x0000

class MainWindow:
    def __init__(self):
        # Customize for WinCE
        if os.name == "ce":
            print "Running under CE"
            className = unicode("win32gui test") # not coverted to unicode
by win32gui
            style = win32con.WS_VISIBLE          # WS_OVERLAPPEDWINDOW isn't
valid style for CE
            hIcon  = 0                           # LoadIcon on
IDI_APPLICATION isn't working      
        else:
            print "Running on desktop"
            className = "win32gui test"
            style = win32con.WS_OVERLAPPEDWINDOW
            hIcon = win32gui.LoadIcon(0, win32con.IDI_APPLICATION)

        # Initialize instance
        win32gui.InitCommonControls()
        self.hinst = 0 # win32api.GetModuleHandle(None)

        # Register class
        wc = win32gui.WNDCLASS()
        wc.style = win32con.CS_HREDRAW | win32con.CS_VREDRAW
        wc.lpfnWndProc = self.MyWndProc
        wc.hCursor = win32gui.LoadCursor( 0, win32con.IDC_ARROW )
        wc.hbrBackground = win32con.COLOR_WINDOW + 1
        wc.hIcon = hIcon
        wc.lpszClassName = className
        wc.cbWndExtra = 0

        classAtom = win32gui.RegisterClass(wc)

        # Create window
        style = win32con.WS_OVERLAPPEDWINDOW | win32con.WS_VISIBLE
        self.hwnd = win32gui.CreateWindow(className,
                                          "win32gui Sample",
                                          style,
                                          win32con.CW_USEDEFAULT,
                                          win32con.CW_USEDEFAULT,
                                          win32con.CW_USEDEFAULT,
                                          win32con.CW_USEDEFAULT,
                                          0,
                                          0,
                                          self.hinst,
                                          None)
        # Hook WndProc
        self.oldWndProc = win32gui.SetWindowLong (self.hwnd,
                                                 win32con.GWL_WNDPROC,
                                                 self.MyWndProc)

        win32gui.ShowWindow(self.hwnd, win32con.SW_SHOW)
        win32gui.UpdateWindow(self.hwnd)

    def MyWndProc(self, hwnd, message, wparam, lparam):
        if message == win32con.WM_PAINT:
            return self.OnPaint(hwnd, message, wparam, lparam)
        if message == win32con.WM_DESTROY:
            return self.OnDestroy(hwnd, message, wparam, lparam)
     
        return win32gui.CallWindowProc(self.oldWndProc, hwnd, message,
wparam, lparam)

    def OnPaint(self, hwnd, message, wparam, lparam):
        print "on paint"
        return win32gui.CallWindowProc(self.oldWndProc, hwnd, message,
wparam, lparam)

    def OnDestroy(self, hwnd, message, wparam, lparam):
        print "on destroy"
        win32gui.PostQuitMessage(0)
        return True

print "Starting up ..."
win32gui.MessageBox(0, "Hello world!", "win32gui Sample", win32con.MB_OK)
w = MainWindow()
win32gui.PumpMessages()
print "Quit?"


More information about the PythonCE mailing list