// InputBox.cpp : implementation file
//
#include "stdafx.h"
#include <common.h>
//#include "InputBox.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CInputBox dialog
/*
void CInputBox::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CInputBox)
DDX_Control(pDX, IDC_BUTTON_BROWSE, m_btnBrowse);
DDX_Control(pDX, IDC_EDIT_NEWWORD, m_Editor);
DDX_Text(pDX, IDC_EDIT_NEWWORD, m_strNewWord);
DDX_Text(pDX, IDC_STATIC_MSSG, m_strMessage);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CInputBox, CDialog)
//{{AFX_MSG_MAP(CInputBox)
ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
*/
/////////////////////////////////////////////////////////////////////////////
// GetInput
#define ID_TEXT 200
LPWORD lpwAlign ( LPWORD lpIn)
{
ULONG ul;
ul = (ULONG) lpIn;
ul +=3;
ul >>=2;
ul <<=2;
return (LPWORD) ul;
}
LRESULT GetInput(HINSTANCE hinst, HWND hwndOwner,
LPSTR lpszMessage, LPSTR lpszInit)
{
HGLOBAL hgbl;
LPDLGTEMPLATE lpdt;
LPDLGITEMTEMPLATE lpdit;
LPWORD lpw;
LPWSTR lpwsz;
LRESULT ret;
int nchar;
hgbl = GlobalAlloc(GMEM_ZEROINIT, 1024);
if (!hgbl) return -1;
lpdt = (LPDLGTEMPLATE)GlobalLock(hgbl);
// Define a dialog box.
lpdt->style = WS_POPUP | WS_BORDER | WS_SYSMENU
| DS_MODALFRAME | WS_CAPTION;
lpdt->cdit = 4; // number of controls
lpdt->x = 10; lpdt->y = 10;
lpdt->cx = 100; lpdt->cy = 100;
lpw = (LPWORD) (lpdt + 1);
*lpw++ = 0; // no menu
*lpw++ = 0; // predefined dialog box class (by default)
lpwsz = (LPWSTR) lpw;
nchar = 1+ MultiByteToWideChar (CP_ACP, 0, "Input Dialog",
-1, lpwsz, 50);
lpw += nchar;
//-----------------------
// Define an OK button.
//-----------------------
lpw = lpwAlign (lpw); // align DLGITEMTEMPLATE on DWORD boundary
lpdit = (LPDLGITEMTEMPLATE) lpw;
lpdit->x = 10; lpdit->y = 70;
lpdit->cx = 80; lpdit->cy = 20;
lpdit->id = IDOK; // OK button identifier
lpdit->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;
lpw = (LPWORD) (lpdit + 1);
*lpw++ = 0xFFFF;
*lpw++ = 0x0080; // button class
lpwsz = (LPWSTR) lpw;
nchar = 1+MultiByteToWideChar (CP_ACP, 0, "OK", -1, lpwsz, 50);
lpw += nchar;
lpw = lpwAlign (lpw); // align creation data on DWORD boundary
*lpw++ = 0; // no creation data
//-----------------------
// Define a Help button.
//-----------------------
lpw = lpwAlign (lpw); // align DLGITEMTEMPLATE on DWORD boundary
lpdit = (LPDLGITEMTEMPLATE) lpw;
lpdit->x = 55; lpdit->y = 10;
lpdit->cx = 40; lpdit->cy = 20;
lpdit->id = IDCANCEL; // Cancel button identifier
lpdit->style = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;
lpw = (LPWORD) (lpdit + 1);
*lpw++ = 0xFFFF;
*lpw++ = 0x0080; // button class atom
lpwsz = (LPWSTR) lpw;
nchar = 1+MultiByteToWideChar (CP_ACP, 0, "Cancel", -1, lpwsz, 50);
lpw += nchar;
lpw = lpwAlign (lpw); // align creation data on DWORD boundary
*lpw++ = 0; // no creation data
//-----------------------
// Define an edit control.
//-----------------------
lpw = lpwAlign (lpw); // align DLGITEMTEMPLATE on DWORD boundary
lpdit = (LPDLGITEMTEMPLATE) lpw;
lpdit->x = 10; lpdit->y = 10;
lpdit->cx = 80; lpdit->cy = 20;
lpdit->id = IDCANCEL; // Cancel button identifier
lpdit->style = WS_CHILD | WS_VISIBLE | SS_LEFT;
lpw = (LPWORD) (lpdit + 1);
*lpw++ = 0xFFFF;
*lpw++ = 0x0081; // edit class atom
for (lpwsz = (LPWSTR)lpw;
*lpwsz++ = (WCHAR) *lpszInit++;
);
lpw = (LPWORD)lpwsz;
lpw = lpwAlign (lpw); // align creation data on DWORD boundary
*lpw++ = 0; // no creation data
//-----------------------
// Define a static text control.
//-----------------------
lpw = lpwAlign (lpw); // align DLGITEMTEMPLATE on DWORD boundary
lpdit = (LPDLGITEMTEMPLATE) lpw;
lpdit->x = 10; lpdit->y = 10;
lpdit->cx = 40; lpdit->cy = 20;
lpdit->id = ID_TEXT; // text identifier
lpdit->style = WS_CHILD | WS_VISIBLE | SS_LEFT;
lpw = (LPWORD) (lpdit + 1);
*lpw++ = 0xFFFF;
*lpw++ = 0x0082; // static class
for (lpwsz = (LPWSTR)lpw;
*lpwsz++ = (WCHAR) *lpszMessage++;
);
lpw = (LPWORD)lpwsz;
lpw = lpwAlign (lpw); // align creation data on DWORD boundary
*lpw++ = 0; // no creation data
GlobalUnlock(hgbl);
ret = DialogBoxIndirect(hinst, (LPDLGTEMPLATE) hgbl,
hwndOwner, (DLGPROC) DialogProc);
GlobalFree(hgbl);
return ret;
}
/*
INT_PTR CALLBACK DialogProc(
HWND hwndDlg, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
BOOL CInputBox::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_Editor.SetSel(MAKELONG(0, -1)); // 처음부터 끝까지.
if (m_bShowBrowse) m_btnBrowse.ModifyStyle( 0, WS_VISIBLE );
else m_btnBrowse.ModifyStyle( WS_VISIBLE, 0 );
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CInputBox::OnButtonBrowse()
{
// TODO: Add your control notification handler code here
OPENFILENAME ofn; // common dialog box structure
TCHAR szFile[260], szInit[256]; // buffer for file name
LPTSTR szTitle=_T("Photo Manager");
HWND hwnd=NULL; //GetParent()->m_hWnd; // owner window
szFile[0] = 0;
UpdateData(TRUE);
lstrcpy(szInit, m_strNewWord);
// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = 260;
ofn.lpstrFilter = "All\0*.*\0Image File\0*.jpg;*.gif;*.bmp;*.tif\0";
ofn.nFilterIndex = 1;
ofn.lpstrTitle = szTitle;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = (LPSTR)szInit;
ofn.Flags = OFN_ENABLEHOOK | OFN_EXPLORER;
ofn.lpfnHook = OFNHookProc;
BOOL sts = GetSaveFileName(&ofn);
if (!sts) showError();
CFileDialog fdlg( TRUE, NULL, (LPCTSTR)m_strNewWord);
fdlg.m_ofn.lpstrTitle = szTitle;
fdlg.m_ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
fdlg.m_ofn.nFilterIndex = 1;
fdlg.m_ofn.lpstrFile = szFile;
fdlg.m_ofn.nMaxFile = 260;
if (fdlg.DoModal()==IDOK) {
m_strNewWord = fdlg.GetFileName();
UpdateData(FALSE);
}
*/
/*
OPENFILENAME ofn; // common dialog box structure
char szFile[260]; // buffer for file name
HWND hwnd; // owner window
HANDLE hf; // file handle
// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
// Display the Open dialog box.
if (GetOpenFileName(&ofn)==TRUE)
hf = CreateFile(ofn.lpstrFile, GENERIC_READ,
0, (LPSECURITY_ATTRIBUTES) NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);
Ofn.lStructSize = sizeof(OPENFILENAME);
Ofn.hwndOwner = hWnd;
Ofn.lpstrFilter = szFilter;
Ofn.lpstrFile= szFile;
Ofn.nMaxFile = sizeof(szFile);
Ofn.lpstrFileTitle = szFileTitle;
Ofn.nMaxFileTitle = sizeof(szFileTitle);
Ofn.lpstrInitialDir = (LPSTR)NULL;
Ofn.Flags = OFN_SHOWHELP | OFN_OVERWRITEPROMPT;
Ofn.lpstrTitle = szTitle;
// Display the Filename common dialog box. The
// filename specified by the user is passed
// to the CreateEnhMetaFile function and used to
// store the metafile on disk.
GetSaveFileName(&Ofn);
UINT_PTR CALLBACK OFNHookProc(
UINT CALLBACK OFNHookProc(
HWND hdlg, // handle to child dialog box
UINT uiMsg, // message identifier
WPARAM wParam, // message parameter
LPARAM lParam // message parameter
)
{
HWND hwndOwner;
RECT rcOwner;
switch (uiMsg) {
case WM_INITDIALOG:
if ((hwndOwner = GetParent(hdlg)) == NULL)
hwndOwner = GetDesktopWindow();
GetWindowRect(hwndOwner, &rcOwner);
OffsetRect(&rcOwner, 200, 200);
SetWindowPos(hwndOwner, HWND_TOP, rcOwner.left,
rcOwner.top, 0, 0, SWP_NOSIZE); // ignores size arguments
break;
}
return NULL;
}
#define ID_HELP 150
#define ID_TEXT 200
LPWORD lpwAlign ( LPWORD lpIn)
{
ULONG ul;
ul = (ULONG) lpIn;
ul +=3;
ul >>=2;
ul <<=2;
return (LPWORD) ul;
}
LRESULT DisplayMyMessage(HINSTANCE hinst, HWND hwndOwner,
LPSTR lpszMessage)
{
HGLOBAL hgbl;
LPDLGTEMPLATE lpdt;
LPDLGITEMTEMPLATE lpdit;
LPWORD lpw;
LPWSTR lpwsz;
LRESULT ret;
int nchar;
hgbl = GlobalAlloc(GMEM_ZEROINIT, 1024);
if (!hgbl)
return -1;
lpdt = (LPDLGTEMPLATE)GlobalLock(hgbl);
// Define a dialog box.
lpdt->style = WS_POPUP | WS_BORDER | WS_SYSMENU
| DS_MODALFRAME | WS_CAPTION;
lpdt->cdit = 3; // number of controls
lpdt->x = 10; lpdt->y = 10;
lpdt->cx = 100; lpdt->cy = 100;
lpw = (LPWORD) (lpdt + 1);
*lpw++ = 0; // no menu
*lpw++ = 0; // predefined dialog box class (by default)
lpwsz = (LPWSTR) lpw;
nchar = 1+ MultiByteToWideChar (CP_ACP, 0, "My Dialog",
-1, lpwsz, 50);
lpw += nchar;
//-----------------------
// Define an OK button.
//-----------------------
lpw = lpwAlign (lpw); // align DLGITEMTEMPLATE on DWORD boundary
lpdit = (LPDLGITEMTEMPLATE) lpw;
lpdit->x = 10; lpdit->y = 70;
lpdit->cx = 80; lpdit->cy = 20;
lpdit->id = IDOK; // OK button identifier
lpdit->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;
lpw = (LPWORD) (lpdit + 1);
*lpw++ = 0xFFFF;
*lpw++ = 0x0080; // button class
lpwsz = (LPWSTR) lpw;
nchar = 1+MultiByteToWideChar (CP_ACP, 0, "OK", -1, lpwsz, 50);
lpw += nchar;
lpw = lpwAlign (lpw); // align creation data on DWORD boundary
*lpw++ = 0; // no creation data
//-----------------------
// Define a Help button.
//-----------------------
lpw = lpwAlign (lpw); // align DLGITEMTEMPLATE on DWORD boundary
lpdit = (LPDLGITEMTEMPLATE) lpw;
lpdit->x = 55; lpdit->y = 10;
lpdit->cx = 40; lpdit->cy = 20;
lpdit->id = ID_HELP; // Help button identifier
lpdit->style = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;
lpw = (LPWORD) (lpdit + 1);
*lpw++ = 0xFFFF;
*lpw++ = 0x0080; // button class atom
lpwsz = (LPWSTR) lpw;
nchar = 1+MultiByteToWideChar (CP_ACP, 0, "Help", -1, lpwsz, 50);
lpw += nchar;
lpw = lpwAlign (lpw); // align creation data on DWORD boundary
*lpw++ = 0; // no creation data
//-----------------------
// Define a static text control.
//-----------------------
lpw = lpwAlign (lpw); // align DLGITEMTEMPLATE on DWORD boundary
lpdit = (LPDLGITEMTEMPLATE) lpw;
lpdit->x = 10; lpdit->y = 10;
lpdit->cx = 40; lpdit->cy = 20;
lpdit->id = ID_TEXT; // text identifier
lpdit->style = WS_CHILD | WS_VISIBLE | SS_LEFT;
lpw = (LPWORD) (lpdit + 1);
*lpw++ = 0xFFFF;
*lpw++ = 0x0082; // static class
for (lpwsz = (LPWSTR)lpw;
*lpwsz++ = (WCHAR) *lpszMessage++;
);
lpw = (LPWORD)lpwsz;
lpw = lpwAlign (lpw); // align creation data on DWORD boundary
*lpw++ = 0; // no creation data
GlobalUnlock(hgbl);
ret = DialogBoxIndirect(hinst, (LPDLGTEMPLATE) hgbl,
hwndOwner, (DLGPROC) DialogProc);
GlobalFree(hgbl);
return ret;
}
typedef struct {
DWORD style;
DWORD dwExtendedStyle;
short x;
short y;
short cx;
short cy;
WORD id; // Windows 95/98/Me: this is a byte
} DLGITEMTEMPLATE, *PDLGITEMTEMPLATE;
0x0080 Button
0x0081 Edit
0x0082 Static
0x0083 List box
0x0084 Scroll bar
0x0085 Combo box
*/
'API' 카테고리의 다른 글
DialogBoxIndirect 샘플 수정 및 코딩 최적화 작업 (1) | 2008.08.06 |
---|---|
DialogBoxIndirect 예제 심플 (2) | 2008.08.06 |
대화상자와 등록 정보 시트 소프트웨어 (0) | 2008.08.06 |
cbWndExtra 이용 윈도우 인스턴스 별로 개별적인 메모리 할당... (1) | 2008.08.06 |
DLL 에 대해서 알아보자. (0) | 2008.08.04 |
재진입성(reentrant)와 스레드 안전성(thread safe)의 개념 (0) | 2008.08.01 |
reentrant와 thread-safe함수와의 관계... (3) | 2008.08.01 |