📄 insobjdlg.c
字号:
/*
* OLEDLG library
*
* Copyright 2003 Ulrich Czekalla for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdarg.h>
#include <stdio.h>
#include "windef.h"
#include "winbase.h"
#include "winreg.h"
#include "winternl.h"
#include "winnls.h"
#include "winerror.h"
#include "wingdi.h"
#include "winuser.h"
#include "wine/debug.h"
#include "wine/unicode.h"
#include "oledlg.h"
#include "resource.h"
WINE_DEFAULT_DEBUG_CHANNEL(oledlg);
typedef struct
{
HWND hwndSelf;
BOOL bObjListInit; /* Object list has been initialized */
LPOLEUIINSERTOBJECTA lpOleUIInsertObject;
HWND hwndObjTypeLBL;
HWND hwndObjTypeLB;
HWND hwndFileLBL;
HWND hwndFileTB;
HWND hwndCreateCtrlCB;
HWND hwndCreateNewCB;
HWND hwndCreateFromFileCB;
HWND hwndDisplayIconCB;
HWND hwndAddCtrlBTN;
HWND hwndBrowseBTN;
HWND hwndResultDesc;
} InsertObjectDlgInfo;
INT_PTR CALLBACK UIInsertObjectDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
static LRESULT UIINSOBJDLG_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam);
static void UIINSERTOBJECTDLG_InitDialog(InsertObjectDlgInfo* pdlgInfo);
static void UIINSERTOBJECTDLG_SelectCreateCtrl(InsertObjectDlgInfo* pdlgInfo);
static void UIINSERTOBJECTDLG_SelectCreateFromFile(InsertObjectDlgInfo* pdlgInfo);
static void UIINSERTOBJECTDLG_SelectCreateNew(InsertObjectDlgInfo* pdlgInfo);
static BOOL UIINSERTOBJECTDLG_PopulateObjectTypes(InsertObjectDlgInfo* pdlgInfo);
static void UIINSERTOBJECTDLG_FreeObjectTypes(InsertObjectDlgInfo* pdlgInfo);
static void UIINSERTOBJECTDLG_SelChange(InsertObjectDlgInfo* pdlgInfo);
static BOOL UIINSERTOBJECTDLG_OnOpen(InsertObjectDlgInfo* pdlgInfo);
static void UIINSERTOBJECTDLG_BrowseFile(InsertObjectDlgInfo* pdlgInfo);
static void UIINSERTOBJECTDLG_AddControl(InsertObjectDlgInfo* pdlgInfo);
typedef HRESULT (*DLLREGISTER) (void);
extern HINSTANCE OLEDLG_hInstance;
static const char OleUIInsertObjectInfoStr[] = "OleUIInsertObjectInfoStr";
/***********************************************************************
* OleUIInsertObjectA (OLEDLG.3)
*/
UINT WINAPI OleUIInsertObjectA(LPOLEUIINSERTOBJECTA lpOleUIInsertObject)
{
LRESULT lRes;
LPCVOID template;
HRSRC hRes;
InsertObjectDlgInfo dlgInfo;
HANDLE hDlgTmpl = 0;
if (lpOleUIInsertObject->lpszTemplate || lpOleUIInsertObject->hResource)
FIXME("Customized template not supported\n");
/* Create the dialog from a template */
if(!(hRes = FindResourceA(OLEDLG_hInstance,MAKEINTRESOURCEA(UIINSERTOBJECT),
(LPSTR)RT_DIALOG)))
{
return OLEUI_ERR_FINDTEMPLATEFAILURE;
}
if (!(hDlgTmpl = LoadResource(OLEDLG_hInstance, hRes )) ||
!(template = LockResource( hDlgTmpl )))
{
return OLEUI_ERR_LOADTEMPLATEFAILURE;
}
/* Initialize InsertObjectDlgInfo structure */
dlgInfo.lpOleUIInsertObject = lpOleUIInsertObject;
dlgInfo.bObjListInit = FALSE;
lRes = DialogBoxIndirectParamA(OLEDLG_hInstance, (const DLGTEMPLATE*) template,
lpOleUIInsertObject->hWndOwner, UIInsertObjectDlgProc,
(LPARAM) &dlgInfo);
/* Unable to create the dialog */
if( lRes == -1)
return OLEUI_ERR_DIALOGFAILURE;
return lRes;
}
/***********************************************************************
* UIInsertObjectDlgProc
*
* OLE UI Insert Object dialog procedure
*/
INT_PTR CALLBACK UIInsertObjectDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
InsertObjectDlgInfo* pdlgInfo = (InsertObjectDlgInfo*) GetPropA(hwnd,OleUIInsertObjectInfoStr);
switch(uMsg)
{
case WM_INITDIALOG:
{
InsertObjectDlgInfo* pdlgInfo = (InsertObjectDlgInfo*)lParam;
pdlgInfo->hwndSelf = hwnd;
SetPropA(hwnd, OleUIInsertObjectInfoStr, (HANDLE) pdlgInfo);
UIINSERTOBJECTDLG_InitDialog(pdlgInfo);
return 0;
}
case WM_COMMAND:
return UIINSOBJDLG_OnWMCommand(hwnd, wParam, lParam);
case WM_DESTROY:
if (pdlgInfo)
UIINSERTOBJECTDLG_FreeObjectTypes(pdlgInfo);
RemovePropA(hwnd, OleUIInsertObjectInfoStr);
return FALSE;
default :
return FALSE;
}
}
/***********************************************************************
* UIINSOBJDLG_OnWMCommand
*
* WM_COMMAND message handler
*/
static LRESULT UIINSOBJDLG_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
WORD wNotifyCode = HIWORD(wParam);
WORD wID = LOWORD(wParam);
InsertObjectDlgInfo* pdlgInfo = (InsertObjectDlgInfo*) GetPropA(hwnd,OleUIInsertObjectInfoStr);
switch(wID)
{
case IDOK:
EndDialog(hwnd, UIINSERTOBJECTDLG_OnOpen(pdlgInfo));
break;
case IDCANCEL:
EndDialog(hwnd, FALSE);
break;
case IDC_CREATECONTROL:
UIINSERTOBJECTDLG_SelectCreateCtrl(pdlgInfo);
break;
case IDC_CREATENEW:
UIINSERTOBJECTDLG_SelectCreateNew(pdlgInfo);
break;
case IDC_CREATEFROMFILE:
UIINSERTOBJECTDLG_SelectCreateFromFile(pdlgInfo);
break;
case IDC_BROWSE:
UIINSERTOBJECTDLG_BrowseFile(pdlgInfo);
break;
case IDC_ADDCONTROL:
UIINSERTOBJECTDLG_AddControl(pdlgInfo);
case IDC_OBJTYPELIST:
{
if (wNotifyCode == LBN_SELCHANGE)
UIINSERTOBJECTDLG_SelChange(pdlgInfo);
break;
}
}
return 0;
}
/***********************************************************************
* UIINSERTOBJECTDLG_InitDialog
*
* Initialize dialog display
*/
static void UIINSERTOBJECTDLG_InitDialog(InsertObjectDlgInfo* pdlgInfo)
{
/* Initialize InsertObjectDlgInfo data structure */
pdlgInfo->hwndObjTypeLB = GetDlgItem(pdlgInfo->hwndSelf, IDC_OBJTYPELIST);
pdlgInfo->hwndObjTypeLBL = GetDlgItem(pdlgInfo->hwndSelf, IDC_OBJTYPELBL);
pdlgInfo->hwndFileLBL = GetDlgItem(pdlgInfo->hwndSelf, IDC_FILELBL);
pdlgInfo->hwndFileTB = GetDlgItem(pdlgInfo->hwndSelf, IDC_FILE);
pdlgInfo->hwndCreateCtrlCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATECONTROL);
pdlgInfo->hwndCreateNewCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATENEW);
pdlgInfo->hwndCreateFromFileCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATEFROMFILE);
pdlgInfo->hwndDisplayIconCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_ASICON);
pdlgInfo->hwndAddCtrlBTN = GetDlgItem(pdlgInfo->hwndSelf, IDC_ADDCONTROL);
pdlgInfo->hwndBrowseBTN = GetDlgItem(pdlgInfo->hwndSelf, IDC_BROWSE);
pdlgInfo->hwndResultDesc = GetDlgItem(pdlgInfo->hwndSelf, IDC_RESULTDESC);
/* Setup dialog controls based on flags */
if (pdlgInfo->lpOleUIInsertObject->lpszCaption)
SetWindowTextA(pdlgInfo->hwndSelf, pdlgInfo->lpOleUIInsertObject->lpszCaption);
ShowWindow(pdlgInfo->hwndCreateCtrlCB, (pdlgInfo->lpOleUIInsertObject->dwFlags &
IOF_SHOWINSERTCONTROL) ? SW_SHOW : SW_HIDE);
ShowWindow(pdlgInfo->hwndDisplayIconCB, (pdlgInfo->lpOleUIInsertObject->dwFlags &
IOF_CHECKDISPLAYASICON) ? SW_SHOW : SW_HIDE);
EnableWindow(pdlgInfo->hwndDisplayIconCB, (pdlgInfo->lpOleUIInsertObject->dwFlags &
IOF_DISABLEDISPLAYASICON) ? FALSE : TRUE);
if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATECONTROL)
UIINSERTOBJECTDLG_SelectCreateCtrl(pdlgInfo);
else if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATEFROMFILE)
UIINSERTOBJECTDLG_SelectCreateFromFile(pdlgInfo);
else /* (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATENEW) */
UIINSERTOBJECTDLG_SelectCreateNew(pdlgInfo);
}
/***********************************************************************
* UIINSERTOBJECTDLG_SelectCreateCtrl
*
* Select Create Control Radio Button
*/
static void UIINSERTOBJECTDLG_SelectCreateCtrl(InsertObjectDlgInfo* pdlgInfo)
{
ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_HIDE);
ShowWindow(pdlgInfo->hwndFileLBL, SW_HIDE);
ShowWindow(pdlgInfo->hwndFileTB, SW_HIDE);
ShowWindow(pdlgInfo->hwndBrowseBTN, SW_HIDE);
ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_SHOW);
ShowWindow(pdlgInfo->hwndObjTypeLB, SW_SHOW);
ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_SHOW);
SendMessageA(pdlgInfo->hwndCreateCtrlCB, BM_SETCHECK, BST_CHECKED, 0);
/* Populate object type listbox */
if (!pdlgInfo->bObjListInit)
UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
}
/***********************************************************************
* UIINSERTOBJECTDLG_SelectCreateNew
*
* Select Create New Radio Button
*/
static void UIINSERTOBJECTDLG_SelectCreateNew(InsertObjectDlgInfo* pdlgInfo)
{
ShowWindow(pdlgInfo->hwndFileLBL, SW_HIDE);
ShowWindow(pdlgInfo->hwndFileTB, SW_HIDE);
ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_HIDE);
ShowWindow(pdlgInfo->hwndBrowseBTN, SW_HIDE);
if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CHECKDISPLAYASICON)
ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_SHOW);
ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_SHOW);
ShowWindow(pdlgInfo->hwndObjTypeLB, SW_SHOW);
SendMessageA(pdlgInfo->hwndCreateNewCB, BM_SETCHECK, BST_CHECKED, 0);
if (!pdlgInfo->bObjListInit)
UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
UIINSERTOBJECTDLG_SelChange(pdlgInfo);
}
/***********************************************************************
* UIINSERTOBJECTDLG_SelectCreateFromFile
*
* Select Create From File Radio Button
*/
static void UIINSERTOBJECTDLG_SelectCreateFromFile(InsertObjectDlgInfo* pdlgInfo)
{
char resstr[MAX_PATH];
ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_HIDE);
ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_HIDE);
ShowWindow(pdlgInfo->hwndObjTypeLB, SW_HIDE);
if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CHECKDISPLAYASICON)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -