Mike McCormack : msi: Subclass the Richedit control.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jan 3 06:37:56 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 00a7faa3777ccb18b81b47c14df427f4f616b4a2
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=00a7faa3777ccb18b81b47c14df427f4f616b4a2

Author: Mike McCormack <mike at codeweavers.com>
Date:   Tue Jan  3 12:15:04 2006 +0100

msi: Subclass the Richedit control.
Send a "DoAction" control event when the user scrolls the text.

---

 dlls/msi/dialog.c |   93 +++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 72 insertions(+), 21 deletions(-)

diff --git a/dlls/msi/dialog.c b/dlls/msi/dialog.c
index ac10dc9..d7b3fdd 100644
--- a/dlls/msi/dialog.c
+++ b/dlls/msi/dialog.c
@@ -59,7 +59,6 @@ struct msi_control_tag
     HBITMAP hBitmap;
     HICON hIcon;
     LPWSTR tabnext;
-    HMODULE hDll;
     WCHAR name[1];
 };
 
@@ -329,7 +328,6 @@ static msi_control *msi_dialog_create_wi
     control->value = NULL;
     control->hBitmap = NULL;
     control->hIcon = NULL;
-    control->hDll = NULL;
     control->tabnext = strdupW( MSI_RecordGetString( rec, 11) );
 
     x = MSI_RecordGetInteger( rec, 4 );
@@ -695,6 +693,42 @@ static UINT msi_dialog_line_control( msi
     return ERROR_SUCCESS;
 }
 
+/******************** Scroll Text ********************************************/
+
+struct msi_scrolltext_info
+{
+    msi_dialog *dialog;
+    msi_control *control;
+    WNDPROC oldproc;
+    HMODULE hRichedit;
+};
+
+static LRESULT WINAPI
+MSIScrollText_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+    struct msi_scrolltext_info *info;
+    HRESULT r;
+
+    TRACE("%p %04x %08x %08lx\n", hWnd, msg, wParam, lParam);
+
+    info = GetPropW( hWnd, szButtonData );
+
+    r = CallWindowProcW( info->oldproc, hWnd, msg, wParam, lParam );
+
+    switch( msg )
+    {
+    case WM_NCDESTROY:
+        FreeLibrary( info->hRichedit );
+        msi_free( info );
+        RemovePropW( hWnd, szButtonData );
+        break;
+    case WM_VSCROLL:
+        msi_dialog_button_handler( info->dialog, info->control, BN_CLICKED );
+        break;
+    }
+    return r;
+}
+
 struct msi_streamin_info
 {
     LPSTR string;
@@ -718,40 +752,59 @@ msi_richedit_stream_in( DWORD_PTR arg, L
     return 0;
 }
 
+static void msi_scrolltext_add_text( msi_control *control, LPCWSTR text )
+{
+    struct msi_streamin_info info;
+    EDITSTREAM es;
+
+    info.string = strdupWtoA( text );
+    info.offset = 0;
+    info.length = lstrlenA( info.string ) + 1;
+
+    es.dwCookie = (DWORD_PTR) &info;
+    es.dwError = 0;
+    es.pfnCallback = msi_richedit_stream_in;
+
+    SendMessageW( control->hwnd, EM_STREAMIN, SF_RTF, (LPARAM) &es );
+
+    msi_free( info.string );
+}
+
 static UINT msi_dialog_scrolltext_control( msi_dialog *dialog, MSIRECORD *rec )
 {
     static const WCHAR szRichEdit20W[] = {
     	'R','i','c','h','E','d','i','t','2','0','W',0
     };
-    struct msi_streamin_info info;
+    struct msi_scrolltext_info *info;
     msi_control *control;
-    LPCWSTR text;
-    EDITSTREAM es;
     DWORD style;
-    HMODULE hRichedit;
 
-    hRichedit = LoadLibraryA("riched20");
+    info = msi_alloc( sizeof *info );
+    if (!info)
+        return ERROR_FUNCTION_FAILED;
+
+    info->hRichedit = LoadLibraryA("riched20");
 
     style = WS_BORDER | ES_MULTILINE | WS_VSCROLL |
             ES_READONLY | ES_AUTOVSCROLL | WS_TABSTOP;
     control = msi_dialog_add_control( dialog, rec, szRichEdit20W, style );
     if (!control)
+    {
+        FreeLibrary( info->hRichedit );
+        msi_free( info );
         return ERROR_FUNCTION_FAILED;
+    }
 
-    control->hDll = hRichedit;
-
-    text = MSI_RecordGetString( rec, 10 );
-    info.string = strdupWtoA( text );
-    info.offset = 0;
-    info.length = lstrlenA( info.string ) + 1;
-
-    es.dwCookie = (DWORD_PTR) &info;
-    es.dwError = 0;
-    es.pfnCallback = msi_richedit_stream_in;
+    info->dialog = dialog;
+    info->control = control;
 
-    SendMessageW( control->hwnd, EM_STREAMIN, SF_RTF, (LPARAM) &es );
+    /* subclass the static control */
+    info->oldproc = (WNDPROC) SetWindowLongPtrW( control->hwnd, GWLP_WNDPROC,
+                                          (LONG_PTR)MSIScrollText_WndProc );
+    SetPropW( control->hwnd, szButtonData, info );
 
-    msi_free( info.string );
+    /* add the text into the richedit */
+    msi_scrolltext_add_text( control, MSI_RecordGetString( rec, 10 ) );
 
     return ERROR_SUCCESS;
 }
@@ -2144,8 +2197,6 @@ void msi_dialog_destroy( msi_dialog *dia
             DestroyIcon( t->hIcon );
         msi_free( t->tabnext );
         msi_free( t );
-        if (t->hDll)
-            FreeLibrary( t->hDll );
     }
 
     /* destroy the list of fonts */




More information about the wine-cvs mailing list