1 // Control.cpp : CControl
\82Ì
\83C
\83\93\83v
\83\8a\83\81\83\93\83e
\81[
\83V
\83\87\83\93
4 #include "SeraphyScriptTools.h"
9 #include "CComEnumDynaVARIANT.h"
13 /////////////////////////////////////////////////////////////////////////////
16 STDMETHODIMP CControl::get_Text(BSTR *pVal)
18 if (!m_hParent || !m_hWnd) {
19 return Error(IDS_ERR_DESTROYED);
22 DWORD siz = ::GetWindowTextLength(m_hWnd);
25 LPTSTR pMes = tmp.GetBufferSetLength(siz + 1);
26 GetWindowText(m_hWnd, pMes, siz + 1);
34 STDMETHODIMP CControl::put_Text(BSTR newVal)
36 if (!m_hParent || !m_hWnd) {
37 return Error(IDS_ERR_DESTROYED);
40 ATL::CString tmp(newVal);
41 ::SetWindowText(m_hWnd, tmp);
45 STDMETHODIMP CControl::get_ID(short *pVal)
48 m_nID = (int)GetWindowLong(m_hWnd, GWL_ID);
54 STDMETHODIMP CControl::put_ID(short newVal)
58 SetWindowLong(m_hWnd, GWL_ID, newVal);
59 if ((m_nID == IDOK) && !lstrcmp(m_classname, _TEXT("BUTTON"))) {
60 // IDOK
\82È
\82ç
\83|
\83b
\83V
\83\85\83{
\83^
\83\93\8c^
\82ð
\83f
\83B
\83t
\83H
\83\8b\83g
\83{
\83^
\83\93\82É
\95Ï
\89»
\82³
\82¹
\82é
61 DWORD m_style = ::GetWindowLong(m_hWnd, GWL_STYLE);
62 m_style |= BS_DEFPUSHBUTTON;
63 ::SetWindowLong(m_hWnd, GWL_STYLE, m_style);
69 STDMETHODIMP CControl::get_Visibility(BOOL *pVal)
71 if (!m_hParent || !m_hWnd) {
73 return Error(IDS_ERR_DESTROYED);
76 WINDOWPLACEMENT pls = {0};
77 pls.length = sizeof(WINDOWPLACEMENT);
78 ::GetWindowPlacement(m_hWnd, &pls);
79 *pVal = (pls.showCmd != SW_HIDE) ? true : false;
83 STDMETHODIMP CControl::put_Visibility(BOOL newVal)
85 if (!m_hParent || !m_hWnd) {
86 return Error(IDS_ERR_DESTROYED);
89 ::ShowWindow(m_hWnd, newVal ? SW_SHOWNORMAL : SW_HIDE);
93 STDMETHODIMP CControl::get_Enable(BOOL *pVal)
95 if (!m_hParent || !m_hWnd) {
97 return Error(IDS_ERR_DESTROYED);
99 *pVal = ::IsWindowEnabled(m_hWnd);
103 STDMETHODIMP CControl::put_Enable(BOOL newVal)
105 if (!m_hParent || !m_hWnd) {
106 return Error(IDS_ERR_DESTROYED);
108 ::EnableWindow(m_hWnd, newVal);
112 STDMETHODIMP CControl::get_CheckState(short *pVal)
115 m_bChecked = (short)::SendMessage(m_hWnd, BM_GETCHECK, 0, 0);
121 STDMETHODIMP CControl::put_CheckState(short newVal)
124 if (m_hWnd && newVal >= 0 && newVal <= 2) {
125 // 0:Unchecked 1:Checked 2:interminate
126 ::SendMessage(m_hWnd, BM_SETCHECK, newVal, 0);
131 BOOL CControl::Create(HWND hParent)
133 // <<
\83f
\83t
\83H
\83\8b\83g
\82Ì
\83v
\83b
\83V
\83\85\83{
\83^
\83\93\82É
\95Ï
\89»
\82³
\82¹
\82é
\83N
\83\8d\96\82\8fp >>
134 if ((m_nID == IDOK) && !lstrcmp(m_classname, _TEXT("BUTTON"))) {
135 // IDOK
\82È
\82ç
\95Ï
\8dX
\82·
\82é
136 m_style |= BS_DEFPUSHBUTTON;
139 //
\81@
\83R
\83\93\83g
\83\8d\81[
\83\8b\82Ì
\90¶
\90¬
140 ATLASSERT(m_hParent == NULL);
142 m_hWnd = ::CreateWindowEx(m_exstyle, m_classname, m_caption,
143 m_style | WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS,
149 ::SetWindowLongPtr(m_hWnd, GWLP_ID, m_nID);
150 ::SetWindowLongPtr(m_hWnd, GWLP_USERDATA, (LONG_PTR) this);
151 ::SetWindowText(m_hWnd, m_caption);
153 //
\90e
\82ª
\83f
\83B
\83Z
\81[
\83u
\83\8b\82È
\82ç
\8eq
\82à
\83f
\83B
\83Z
\81[
\83u
\83\8b\8fó
\91Ô
\82Å
\8dì
\90¬
\82·
\82é
154 if (!::IsWindowEnabled(m_hParent)) {
155 ::EnableWindow(m_hWnd, false);
158 //////////////////////////
159 //
\8e\96\91O
\8fó
\91Ô
\82Ì
\90Ý
\92è
160 if (!lstrcmp(m_classname, _TEXT("BUTTON"))) {
161 //
\83{
\83^
\83\93\82È
\82ç
\83`
\83F
\83b
\83N
\8fó
\91Ô
\82Ì
\83Z
\83b
\83g
163 ::SendMessage(m_hWnd, BM_SETCHECK, 1, 0);
166 else if (!lstrcmp(m_classname, WC_LISTVIEW)) {
167 //
\83\8a\83X
\83g
\83r
\83\85\81[
\82È
\82ç
\83J
\83\89\83\80\82Ì
\90Ý
\92è
\82ð
\8ds
\82¤
168 LPCTSTR p = m_caption;
170 //
\83E
\83B
\83\93\83h
\83E
\83L
\83\83\83v
\83V
\83\87\83\93\82©
\82ç
\97ñ
\8c©
\8fo
\82µ
\82ð
\8dì
\90¬
\82·
\82é
173 while (*p && *p != ',' && *p != ':') {
178 TCHAR szColumn[MAX_PATH] = {0};
179 _tcsncpy_s(szColumn, MAX_PATH, st, sz);
182 col.mask = LVCF_TEXT | LVCF_WIDTH;
183 col.pszText = szColumn;
184 col.cx = ListView_GetStringWidth(m_hWnd, szColumn) + 16;
185 ListView_InsertColumn(m_hWnd, m_nColumnCount, &col);
187 if (*p == ',' || *p == ':') {
193 ListView_SetExtendedListViewStyle(m_hWnd, m_afterstyle);
196 else if (!lstrcmp(m_classname, WC_TREEVIEW)) {
197 TreeView_SetImageList(m_hWnd, NULL, TVSIL_NORMAL);
202 void CControl::Destroy()
206 //
\83E
\83B
\83\93\83h
\83E
\82ð
\94j
\8aü
\82·
\82é
207 //
\83E
\83B
\83\93\83h
\83E
\82Ì
\94j
\8aü
\82Æ
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\94j
\8aü
\82Í
\88ê
\92v
\82µ
\82È
\82¢
\81B
208 ::DestroyWindow(m_hWnd);
213 STDMETHODIMP CControl::get_Width(short *pVal)
216 WINDOWPLACEMENT pls = {0};
217 pls.length = sizeof(WINDOWPLACEMENT);
218 ::GetWindowPlacement(m_hWnd, &pls);
219 m_w = (short)(pls.rcNormalPosition.right - pls.rcNormalPosition.left);
225 STDMETHODIMP CControl::put_Width(short newVal)
229 WINDOWPLACEMENT pls = {0};
230 pls.length = sizeof(WINDOWPLACEMENT);
231 ::GetWindowPlacement(m_hWnd, &pls);
237 pls.rcNormalPosition.right - pls.rcNormalPosition.left,
238 SWP_NOZORDER | SWP_NOMOVE
244 STDMETHODIMP CControl::get_Height(short *pVal)
247 WINDOWPLACEMENT pls = {0};
248 pls.length = sizeof(WINDOWPLACEMENT);
249 ::GetWindowPlacement(m_hWnd, &pls);
250 m_h = (short)(pls.rcNormalPosition.bottom - pls.rcNormalPosition.top);
256 STDMETHODIMP CControl::put_Height(short newVal)
260 WINDOWPLACEMENT pls = {0};
261 pls.length = sizeof(WINDOWPLACEMENT);
262 ::GetWindowPlacement(m_hWnd, &pls);
268 pls.rcNormalPosition.right - pls.rcNormalPosition.left,
269 SWP_NOZORDER | SWP_NOMOVE
275 STDMETHODIMP CControl::get_PosX(short *pVal)
278 WINDOWPLACEMENT pls = {0};
279 pls.length = sizeof(WINDOWPLACEMENT);
280 ::GetWindowPlacement(m_hWnd, &pls);
281 m_x = (short)pls.rcNormalPosition.left;
287 STDMETHODIMP CControl::put_PosX(short newVal)
291 WINDOWPLACEMENT pls = {0};
292 pls.length = sizeof(WINDOWPLACEMENT);
293 ::GetWindowPlacement(m_hWnd, &pls);
297 m_x, pls.rcNormalPosition.top,
299 SWP_NOZORDER | SWP_NOSIZE
305 STDMETHODIMP CControl::get_PosY(short *pVal)
308 WINDOWPLACEMENT pls = {0};
309 pls.length = sizeof(WINDOWPLACEMENT);
310 ::GetWindowPlacement(m_hWnd, &pls);
311 m_y = (short)pls.rcNormalPosition.top;
317 STDMETHODIMP CControl::put_PosY(short newVal)
321 WINDOWPLACEMENT pls = {0};
322 pls.length = sizeof(WINDOWPLACEMENT);
323 ::GetWindowPlacement(m_hWnd, &pls);
327 pls.rcNormalPosition.left,
330 SWP_NOZORDER | SWP_NOSIZE
336 STDMETHODIMP CControl::SetPlacement(VARIANT x, VARIANT y, VARIANT w, VARIANT h, VARIANT *pvarUnk)
338 //
\83T
\83C
\83Y
\95Ï
\8dX
339 CComVariant varX, varY, varW, varH;
340 if ((x.vt != VT_EMPTY && x.vt != VT_NULL && x.vt != VT_ERROR) && SUCCEEDED(varX.ChangeType(VT_I2, &x))) {
343 if ((y.vt != VT_EMPTY && y.vt != VT_NULL && y.vt != VT_ERROR) && SUCCEEDED(varY.ChangeType(VT_I2, &y))) {
346 if ((h.vt != VT_EMPTY && h.vt != VT_NULL && h.vt != VT_ERROR) && SUCCEEDED(varH.ChangeType(VT_I2, &h))) {
349 if ((w.vt != VT_EMPTY && w.vt != VT_NULL && w.vt != VT_ERROR) && SUCCEEDED(varW.ChangeType(VT_I2, &w))) {
352 //
\83E
\83B
\83\93\83h
\83E
\82ª
\95\
\8e¦
\82³
\82ê
\82Ä
\82¢
\82ê
\82Î
\82½
\82¾
\82¿
\82É
\94½
\89f
354 ::SetWindowPos(m_hWnd, NULL, m_x, m_y, m_w, m_h, SWP_NOZORDER);
356 GetThisInterface(pvarUnk);
360 STDMETHODIMP CControl::SetCheck(VARIANT *pvarUnk)
362 //
\82½
\82¾
\82¿
\82É
\83`
\83F
\83b
\83N
\82·
\82é
363 put_CheckState(true);
364 GetThisInterface(pvarUnk);
368 STDMETHODIMP CControl::SetID(VARIANT varID, VARIANT *pvarUnk)
370 //
\92¼
\82¿
\82ÉID
\82ð
\8a\84\82è
\93\96\82Ä
\82é
372 if (varID.vt != VT_EMPTY && varID.vt != VT_EMPTY && varID.vt != VT_EMPTY
373 && SUCCEEDED(tmp.ChangeType(VT_I2, &varID))) {
378 GetThisInterface(pvarUnk);
382 void CControl::GetThisInterface(VARIANT *pvarUnk)
384 //
\82±
\82Ì
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82ð
\95Ô
\82·
385 ::VariantInit(pvarUnk);
386 IUnknown* pUnk = NULL;
387 if (SUCCEEDED(QueryInterface(IID_IUnknown, (void**)&pUnk))) {
388 pvarUnk->vt = VT_UNKNOWN;
389 pvarUnk->punkVal = pUnk;
393 int CControl::GetID()
398 STDMETHODIMP CControl::get_Style(long *pVal)
401 m_style = ::GetWindowLong(m_hWnd, GWL_STYLE);
407 STDMETHODIMP CControl::put_Style(long newVal)
411 ::SetWindowLong(m_hWnd, GWL_STYLE, m_style);
416 STDMETHODIMP CControl::get_Exstyle(long *pVal)
419 m_exstyle = ::GetWindowLong(m_hWnd, GWL_EXSTYLE);
425 STDMETHODIMP CControl::put_Exstyle(long newVal)
429 ::SetWindowLong(m_hWnd, GWL_EXSTYLE, m_exstyle);
434 STDMETHODIMP CControl::get_ClassName(BSTR *pVal)
436 CComBSTR tmp(m_classname);
437 *pVal = tmp.Detach();
441 STDMETHODIMP CControl::Refresh()
443 if (!m_hParent || !m_hWnd) {
444 return Error(IDS_ERR_DESTROYED);
450 SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_DRAWFRAME | SWP_FRAMECHANGED | SWP_NOCOPYBITS);
454 STDMETHODIMP CControl::get_HWND(long *pVal)
456 *pVal = (long)m_hWnd;
460 HRESULT CControl::ConvertVariantToString(VARIANT text, ATL::CString &retval)
463 HRESULT hr = varText.ChangeType(VT_BSTR, &text);
468 retval = varText.bstrVal;
472 STDMETHODIMP CControl::AddString(VARIANT text, VARIANT* pRet)
476 if (!m_hParent || !m_hWnd) {
477 return Error(IDS_ERR_DESTROYED);
481 HRESULT hr = ConvertVariantToString(text, buf);
487 if (!lstrcmp(m_classname, _TEXT("COMBOBOX"))) {
488 //
\83R
\83\93\83{
\83{
\83b
\83N
\83X
\82É
\95¶
\8e\9a\97ñ
\82ð
\92Ç
\89Á
\82·
\82é
489 ret = (short)SendMessage(m_hWnd, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)buf);
491 else if (!lstrcmp(m_classname, _TEXT("LISTBOX"))) {
492 //
\98A
\91z
\94z
\97ñ
\83I
\83u
\83W
\83F
\83N
\83g
\82ð
\8dì
\90¬
\82·
\82é
493 CComObject<CObjectMap>* pMap = NULL;
494 if (FAILED(hr = CComObject<CObjectMap>::CreateInstance(&pMap))) {
497 IUnknown* pMapUnk = NULL;
498 if (FAILED(hr = pMap->QueryInterface(&pMapUnk))) {
502 //
\83\8a\83X
\83g
\83{
\83b
\83N
\83X
\82É
\95¶
\8e\9a\97ñ
\82ð
\92Ç
\89Á
\82·
\82é
503 int nIdx = SendMessage(m_hWnd, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)buf);
505 //
\83\8a\83X
\83g
\83{
\83b
\83N
\83X
\82Ì
\83A
\83C
\83e
\83\80\82É
\98A
\91z
\94z
\97ñ
\82ð
\83o
\83C
\83\93\83h
\82·
\82é.
506 ::SendMessage(m_hWnd, LB_SETITEMDATA, nIdx, (LPARAM)pMapUnk);
509 else if (!lstrcmp(m_classname, WC_LISTVIEW)) {
510 //
\83\8a\83X
\83g
\83r
\83\85\81[
\82É
\95¶
\8e\9a\97ñ
\82ð
\92Ç
\89Á
\82·
\82é
511 int cnt = ListView_GetItemCount(m_hWnd);
513 item.mask = LVIF_TEXT;
514 item.pszText = buf.GetBuffer();
516 int nIdx = ListView_InsertItem(m_hWnd, &item);
518 //
\83T
\83u
\83J
\83\89\83\80\82Í
\8bó
\95¶
\82ð
\96\84\82ß
\82é
519 for (int i = 1; i < m_nColumnCount; i++) {
520 ListView_SetItemText(m_hWnd, nIdx, i, _TEXT(""));
523 //
\98A
\91z
\94z
\97ñ
\83I
\83u
\83W
\83F
\83N
\83g
\82ð
\83o
\83C
\83\93\83h
\82·
\82é
524 CComObject<CObjectMap>* pMap = NULL;
525 if (FAILED(hr = CComObject<CObjectMap>::CreateInstance(&pMap))) {
529 IUnknown* pUnk = NULL;
530 if (FAILED(hr = pMap->QueryInterface(IID_IUnknown, (void**)&pUnk))) {
536 itm.mask = LVIF_PARAM;
537 itm.lParam = (LPARAM)pUnk;
538 ListView_SetItem(m_hWnd, &itm);
541 else if (!lstrcmp(m_classname, WC_TREEVIEW)) {
542 //
\83c
\83\8a\81[
\83r
\83\85\81[
\82Ì
\83\8b\81[
\83g
\82É
\83A
\83C
\83e
\83\80\82ð
\8dì
\90¬
\82·
\82é
543 CComPtr<IUnknown> pUnk;
545 if (FAILED(hr = CTreeItem::CreateTreeItem(m_hWnd, TVI_ROOT, buf, &pUnk))) {
549 ret = pUnk; // pUnk
\82ÍVariant
\91ã
\93ü
\8e\9e\82ÉAddRef
\82³
\82ê
\82é
\82Ì
\82ÅDetach
\82Í
\95s
\97v.
553 //
\82»
\82ê
\88È
\8aO
\82Í
\83T
\83|
\81[
\83g
\8aO
554 return Error(IDS_ERR_NOTSUPPORTCONTROL);
556 return ret.Detach(pRet);
559 STDMETHODIMP CControl::SetColumnText(VARIANT item, VARIANT col, VARIANT text)
561 if (!m_hParent || !m_hWnd) {
562 return Error(IDS_ERR_DESTROYED);
567 CComVariant varIdx, varCol;
568 if (SUCCEEDED(varIdx.ChangeType(VT_I2, &item))) {
571 if (SUCCEEDED(varCol.ChangeType(VT_I2, &col))) {
574 if (nIdx < 0 || nCol < 0) {
575 //
\8ds
\81E
\8c\85\82ª
\8eæ
\93¾
\82Å
\82«
\82È
\82©
\82Á
\82½
\8fê
\8d\87
576 return DISP_E_TYPEMISMATCH;
580 HRESULT hr = ConvertVariantToString(text, buf);
585 if (!lstrcmp(m_classname, WC_LISTVIEW)) {
586 int mx = ListView_GetItemCount(m_hWnd);
587 if (nIdx >= mx || nCol >= m_nColumnCount) {
588 //
\8ds
\82Ü
\82½
\82Í
\8c\85\82ª
\83I
\81[
\83o
\81[
\82µ
\82Ä
\82¢
\82é
\8fê
\8d\87
589 return Error(IDS_ERR_RANDEOUT);
592 //
\83\8a\83X
\83g
\83r
\83\85\81[
\82É
\95¶
\8e\9a\97ñ
\82ð
\92Ç
\89Á
\82·
\82é
593 ListView_SetItemText(m_hWnd, nIdx, nCol, buf.GetBuffer());
597 //
\82»
\82ê
\88È
\8aO
\82Í
\83T
\83|
\81[
\83g
\8aO
598 return Error(IDS_ERR_NOTSUPPORTCONTROL);
603 STDMETHODIMP CControl::GetColumnText(VARIANT idx, VARIANT col, VARIANT *pText)
606 if (!m_hParent || !m_hWnd) {
607 return Error(IDS_ERR_DESTROYED);
612 CComVariant varIdx, varCol;
613 if (SUCCEEDED(varIdx.ChangeType(VT_I2, &idx))) {
616 if (SUCCEEDED(varCol.ChangeType(VT_I2, &col))) {
620 if (nIdx < 0 || nCol < 0) {
621 return DISP_E_BADINDEX;
624 if (!lstrcmp(m_classname, WC_LISTVIEW)) {
625 //
\83C
\83\93\83f
\83b
\83N
\83X
\82ð
\92²
\8d¸
626 int mx = ListView_GetItemCount(m_hWnd);
627 if (nIdx >= mx || nCol >= m_nColumnCount) {
628 return Error(IDS_ERR_RANDEOUT);
631 //
\83\8a\83X
\83g
\83r
\83\85\81[
\82©
\82ç
\95¶
\8e\9a\97ñ
\82ð
\8eæ
\93¾
\82·
\82é
633 LPTSTR pBuf = buf.GetBufferSetLength(MAX_PATH);
634 ListView_GetItemText(m_hWnd, nIdx, nCol, pBuf, MAX_PATH);
638 //
\82»
\82ê
\88È
\8aO
\82Í
\83T
\83|
\81[
\83g
\8aO
639 return Error(IDS_ERR_NOTSUPPORTCONTROL);
641 return ret.Detach(pText);
644 STDMETHODIMP CControl::get_ItemObject(VARIANT idx, VARIANT *pVal)
647 if (!m_hParent || !m_hWnd) {
648 return Error(IDS_ERR_DESTROYED);
653 if (SUCCEEDED(varIdx.ChangeType(VT_I2, &idx))) {
658 return DISP_E_BADINDEX;
661 IUnknown* pUnk = NULL;
662 if (!lstrcmp(m_classname, _TEXT("LISTBOX"))) {
663 //
\83\8a\83X
\83g
\83{
\83b
\83N
\83X
\82©
\82ç
\98A
\91z
\94z
\97ñ
\83I
\83u
\83W
\83F
\83N
\83g
\82ð
\8eæ
\93¾
\82·
\82é
664 int mx = ::SendMessage(m_hWnd, LB_GETCOUNT, 0, 0);
666 return Error(IDS_ERR_RANDEOUT);
668 LRESULT data = ::SendMessage(m_hWnd, LB_GETITEMDATA, nIdx, 0);
669 if (data != LB_ERR && data) {
670 pUnk = (IUnknown*)data;
673 else if (!lstrcmp(m_classname, WC_LISTVIEW)) {
674 //
\83\8a\83X
\83g
\83r
\83\85\81[
\82©
\82ç
\98A
\91z
\94z
\97ñ
\83I
\83u
\83W
\83F
\83N
\83g
\82ð
\8eæ
\93¾
\82·
\82é
675 int mx = ListView_GetItemCount(m_hWnd);
677 return Error(IDS_ERR_RANDEOUT);
681 itm.mask = LVIF_PARAM;
683 if (ListView_GetItem(m_hWnd, &itm)) {
685 pUnk = (IUnknown*)itm.lParam;
690 //
\82»
\82ê
\88È
\8aO
\82Í
\83T
\83|
\81[
\83g
\8aO
691 return Error(IDS_ERR_NOTSUPPORTCONTROL);
695 CComVariant tmp(pUnk);
696 return tmp.Detach(pVal);
701 STDMETHODIMP CControl::DeleteAllItems()
703 if (!m_hParent || !m_hWnd) {
704 return Error(IDS_ERR_DESTROYED);
706 //
\83R
\83\93\83g
\83\8d\81[
\83\8b\82Ì
\93à
\95\94\83A
\83C
\83e
\83\80\82É
\8aÖ
\98A
\95t
\82¯
\82ç
\82ê
\82Ä
\82¢
\82½
\98A
\91z
\94z
\97ñ
\83I
\83u
\83W
\83F
\83N
\83g
\82ð
\89ð
\95ú
\82·
\82é
707 if (!lstrcmp(m_classname, _TEXT("LISTBOX"))) {
708 //
\83\8a\83X
\83g
\82Ì
\89ð
\95ú
709 int mx = ::SendMessage(m_hWnd, CB_GETCOUNT, 0, 0);
710 for (int i = 0; i < mx; i++) {
711 LRESULT data = ::SendMessage(m_hWnd, LB_GETITEMDATA, i, 0);
712 if (data != LB_ERR && data) {
713 ((IUnknown*)data)->Release();
717 else if (!lstrcmp(m_classname, WC_LISTVIEW)) {
718 //
\83\8a\83X
\83g
\83r
\83\85\81[
\82Ì
\98A
\91z
\94z
\97ñ
\82Ì
\89ð
\95ú
719 int mx = ListView_GetItemCount(m_hWnd);
721 for (int i = 0; i < mx; i++) {
722 itm.mask = LVIF_PARAM;
724 if (ListView_GetItem(m_hWnd, &itm)) {
726 ((IUnknown*)itm.lParam)->Release();
731 else if (!lstrcmp(m_classname, WC_TREEVIEW)) {
732 //
\83c
\83\8a\81[
\83r
\83\85\81[
\82Ì
\98A
\91z
\94z
\97ñ
\82Ì
\89ð
\95ú
733 HTREEITEM hItem = TreeView_GetRoot(m_hWnd);
735 HTREEITEM hNextItem = TreeView_GetNextSibling(m_hWnd, hItem);
736 CTreeItem::DeleteTreeItemWithData(m_hWnd, hItem);
740 //
\98A
\91z
\94z
\97ñ
\82ð
\82à
\82½
\82È
\82¢
\83R
\83\93\83g
\83\8d\81[
\83\8b\82Ì
\8f\89\8aú
\89»
741 else if (!lstrcmp(m_classname, _TEXT("COMBOBOX"))) {
743 int cnt = ::SendMessage(m_hWnd, CB_GETCOUNT, 0, 0);
745 ::SendMessage(m_hWnd, CB_DELETESTRING, 0, 0);
749 else if (!lstrcmp(m_classname, _TEXT("EDIT"))) {
751 CComVariant dmy(L"");
752 put_Text(dmy.bstrVal);
756 STDMETHODIMP CControl::DeleteString(VARIANT idx, VARIANT *pRet)
760 if (!m_hParent || !m_hWnd) {
761 return Error(IDS_ERR_DESTROYED);
766 if (SUCCEEDED(varIdx.ChangeType(VT_I2, &idx))) {
770 return DISP_E_BADINDEX;
774 if (!lstrcmp(m_classname, _TEXT("COMBOBOX"))) {
775 //
\83R
\83\93\83{
\83{
\83b
\83N
\83X
\82©
\82ç
\95¶
\8e\9a\97ñ
\82ð
\8dí
\8f\9c\82·
\82é
776 int mx = ::SendMessage(m_hWnd, CB_GETCOUNT, 0, 0);
778 return Error(IDS_ERR_RANDEOUT);
780 int result = ::SendMessage(m_hWnd, CB_DELETESTRING, nIdx, 0);
781 ret = (bool)(result != LB_ERR);
783 else if (!lstrcmp(m_classname, _TEXT("LISTBOX"))) {
784 //
\83\8a\83X
\83g
\83{
\83b
\83N
\83X
\82©
\82ç
\95¶
\8e\9a\97ñ
\82ð
\8dí
\8f\9c\82·
\82é
785 int mx = ::SendMessage(m_hWnd, LB_GETCOUNT, 0, 0);
787 return Error(IDS_ERR_RANDEOUT);
790 //
\98A
\91z
\94z
\97ñ
\83I
\83u
\83W
\83F
\83N
\83g
\82ð
\94j
\8aü
\82·
\82é
791 LRESULT data = ::SendMessage(m_hWnd, LB_GETITEMDATA, nIdx, 0);
792 if (data != LB_ERR && data) {
793 ((IUnknown*)data)->Release();
797 int result = ::SendMessage(m_hWnd, LB_DELETESTRING, nIdx, 0);
798 ret = (bool)(result != LB_ERR);
800 else if (!lstrcmp(m_classname, WC_LISTVIEW)) {
801 //
\83\8a\83X
\83g
\83r
\83\85\81[
\82©
\82ç
\95¶
\8e\9a\97ñ
\82ð
\8dí
\8f\9c\82·
\82é
802 int mx = ListView_GetItemCount(m_hWnd);
804 return Error(IDS_ERR_RANDEOUT);
807 //
\98A
\91z
\94z
\97ñ
\83I
\83u
\83W
\83F
\83N
\83g
\82ð
\94j
\8aü
\82·
\82é
809 itm.mask = LVIF_PARAM;
811 if (ListView_GetItem(m_hWnd, &itm)) {
813 ((IUnknown*)itm.lParam)->Release();
818 ret = ListView_DeleteItem(m_hWnd, nIdx) ? true : false;
821 //
\82»
\82ê
\88È
\8aO
\82Í
\83T
\83|
\81[
\83g
\8aO
822 return Error(IDS_ERR_NOTSUPPORTCONTROL);
825 return ret.Detach(pRet);
828 STDMETHODIMP CControl::GetCount(VARIANT *pRet)
832 if (!m_hParent || !m_hWnd) {
833 return Error(IDS_ERR_DESTROYED);
837 if (!lstrcmp(m_classname, _TEXT("COMBOBOX"))) {
838 //
\83\8a\83X
\83g
\83{
\83b
\83N
\83X
\82Ì
\83J
\83E
\83\93\83g
839 int mx = ::SendMessage(m_hWnd, CB_GETCOUNT, 0, 0);
845 else if (!lstrcmp(m_classname, _TEXT("LISTBOX"))) {
846 //
\83\8a\83X
\83g
\83{
\83b
\83N
\83X
\82Ì
\83J
\83E
\83\93\83g
847 int mx = ::SendMessage(m_hWnd, LB_GETCOUNT, 0, 0);
853 else if (!lstrcmp(m_classname, WC_LISTVIEW)) {
854 //
\83\8a\83X
\83g
\83r
\83\85\81[
\82Ì
\83J
\83E
\83\93\83g
855 ret = (short)ListView_GetItemCount(m_hWnd);
858 //
\82»
\82ê
\88È
\8aO
\82Í
\83T
\83|
\81[
\83g
\8aO
859 return Error(IDS_ERR_NOTSUPPORTCONTROL);
861 return ret.Detach(pRet);
864 STDMETHODIMP CControl::get_CurrentSelectedItem(VARIANT *pVal)
868 if (!m_hParent || !m_hWnd) {
869 return Error(IDS_ERR_DESTROYED);
873 if (!lstrcmp(m_classname, _TEXT("COMBOBOX"))) {
874 //
\83R
\83\93\83{
\83{
\83b
\83N
\83X
\82Ì
\8c»
\8dÝ
\82Ì
\91I
\91ð
\82ð
\95Ô
\82·
875 ret = (long)::SendMessage(m_hWnd, CB_GETCURSEL, 0, 0);
877 else if (!lstrcmp(m_classname, _TEXT("LISTBOX"))) {
878 //
\83\8a\83X
\83g
\83{
\83b
\83N
\83X
\82Ì
\8c»
\8dÝ
\82Ì
\91I
\91ð
\83A
\83C
\83e
\83\80\82ð
\95Ô
\82·
879 if (!(m_style & LBS_MULTIPLESEL)) {
880 //
\83V
\83\93\83O
\83\8b\83Z
\83\8c\83N
\83g
\82Ì
\8fê
\8d\87
881 ret = (long)::SendMessage(m_hWnd, LB_GETCURSEL, 0, 0);
884 //
\83}
\83\8b\83`
\83Z
\83\8c\83N
\83g
\82Ì
\8fê
\8d\87\82Í
\8dÅ
\8f\89\82Ì
\91I
\91ð
\83A
\83C
\83e
\83\80\82ð
\95Ô
\82·
886 int mx = ::SendMessage(m_hWnd, LB_GETCOUNT, 0, 0);
888 std::vector<long> buf(mx + 1);
889 long* pBuf = &buf[0];
890 int cnt = ::SendMessage(m_hWnd, LB_GETSELITEMS, mx, (LPARAM)pBuf);
891 if (cnt != LB_ERR && cnt > 0) {
897 else if (!lstrcmp(m_classname, WC_LISTVIEW)) {
898 //
\83\8a\83X
\83g
\83r
\83\85\81[
\82Ì
\8dÅ
\8f\89\82Ì
\91I
\91ð
\83A
\83C
\83e
\83\80\82ð
\92T
\82·
899 ret = (long)ListView_GetNextItem(m_hWnd, -1, LVNI_SELECTED);
901 else if (!lstrcmp(m_classname, WC_TREEVIEW)) {
902 //
\83c
\83\8a\81[
\83r
\83\85\81[
\82Ì
\8ew
\92è
\83A
\83C
\83e
\83\80\82Ì
\91®
\90«
\82ð
\92²
\82×
\82é
903 HTREEITEM hItem = TreeView_GetSelection(m_hWnd);
905 CComObject<CTreeItem>* pItem = NULL;
907 if (FAILED(hr = CComObject<CTreeItem>::CreateInstance(&pItem))) {
911 IUnknown* pUnk = NULL;
912 if (FAILED(hr = pItem->QueryInterface(&pUnk))) {
917 //FIXME:
\95s
\97v
\82Ì
\82Í
\82¸ pItem->AddRef();
918 pItem->SetParam(m_hWnd, hItem);
923 //
\82»
\82ê
\88È
\8aO
\82Í
\83T
\83|
\81[
\83g
\8aO
924 return Error(IDS_ERR_NOTSUPPORTCONTROL);
926 return ret.Detach(pVal);
929 STDMETHODIMP CControl::put_CurrentSelectedItem(VARIANT newVal)
931 if (!m_hParent || !m_hWnd) {
932 return Error(IDS_ERR_DESTROYED);
937 if (SUCCEEDED(varIdx.ChangeType(VT_I4, &newVal))) {
941 if (!lstrcmp(m_classname, _TEXT("COMBOBOX"))) {
942 //
\83R
\83\93\83{
\83{
\83b
\83N
\83X
\82ð
\91I
\91ð
\82ð
\8ew
\92è
\82·
\82é
943 ::SendMessage(m_hWnd, CB_SETCURSEL, nIdx, 0);
945 else if (!lstrcmp(m_classname, _TEXT("LISTBOX"))) {
946 //
\83\8a\83X
\83g
\83{
\83b
\83N
\83X
\82Ì
\91I
\91ð
947 if (!(m_style & LBS_MULTIPLESEL)) {
948 //
\83V
\83\93\83O
\83\8b\83Z
\83\8c\83N
\83g
\82Ì
\8fê
\8d\87
949 ::SendMessage(m_hWnd, LB_SETCURSEL, nIdx, 0);
952 //
\83}
\83\8b\83`
\83Z
\83\8c\83N
\83g
\82Ì
\8fê
\8d\87
953 int mx = ::SendMessage(m_hWnd, LB_GETCOUNT, 0, 0);
954 for (int i = 0; i < mx; i++) {
955 ::SendMessage(m_hWnd, LB_SETSEL, FALSE, i);
957 if (nIdx >= 0 && nIdx < mx) {
958 ::SendMessage(m_hWnd, LB_SETSEL, TRUE, nIdx);
962 else if (!lstrcmp(m_classname, WC_LISTVIEW)) {
963 //
\83\8a\83X
\83g
\83r
\83\85\81[
\82Ì
\91I
\91ð
964 int mx = ListView_GetItemCount(m_hWnd);
965 ListView_SetItemState(m_hWnd, -1, LVIS_SELECTED, 0);
966 if (nIdx >= 0 && nIdx < mx) {
967 ListView_SetItemState(m_hWnd, nIdx, LVIS_SELECTED, LVIS_SELECTED);
971 //
\82»
\82ê
\88È
\8aO
\82Í
\83T
\83|
\81[
\83g
\8aO
972 return Error(IDS_ERR_NOTSUPPORTCONTROL);
977 STDMETHODIMP CControl::get__NewEnum(IUnknown **pVal)
981 if (!m_hParent || !m_hWnd) {
982 return Error(IDS_ERR_DESTROYED);
985 std::vector<VARIANT> varArray;
988 if (!lstrcmp(m_classname, _TEXT("COMBOBOX"))) {
989 //
\83R
\83\93\83{
\83{
\83b
\83N
\83X
\82Ì
\8c»
\8dÝ
\82Ì
\91I
\91ð
\82ð
\95Ô
\82·
990 int nIdx = ::SendMessage(m_hWnd, CB_GETCURSEL, 0, 0);
993 ::VariantInit(&varArray[0]);
994 varArray[0].vt = VT_I2;
995 varArray[0].iVal = nIdx;
997 else if (!lstrcmp(m_classname, _TEXT("LISTBOX"))) {
998 //
\83\8a\83X
\83g
\83{
\83b
\83N
\83X
\82Ì
\8c»
\8dÝ
\82Ì
\91I
\91ð
\83A
\83C
\83e
\83\80\82ð
\95Ô
\82·
999 if (!(m_style & LBS_MULTIPLESEL)) {
1000 //
\83V
\83\93\83O
\83\8b\83Z
\83\8c\83N
\83g
\82Ì
\8fê
\8d\87
1001 int nIdx = ::SendMessage(m_hWnd, LB_GETCURSEL, 0, 0);
1004 ::VariantInit(&varArray[0]);
1005 varArray[0].vt = VT_I2;
1006 varArray[0].iVal = nIdx;
1009 //
\83}
\83\8b\83`
\83Z
\83\8c\83N
\83g
\82Ì
\8fê
\8d\87\82Í
\8dÅ
\8f\89\82Ì
\91I
\91ð
\83A
\83C
\83e
\83\80\82ð
\95Ô
\82·
1010 int sz = ::SendMessage(m_hWnd, LB_GETCOUNT, 0, 0);
1011 std::vector<long> buf(sz + 1);
1012 long* pBuf = &buf[0];
1013 mx = ::SendMessage(m_hWnd, LB_GETSELITEMS, sz, (LPARAM)pBuf);
1015 //
\91I
\91ð
\82ª
\95Ô
\82³
\82ê
\82½
\8fê
\8d\87
1016 varArray.resize(mx + 1);
1017 for (int i = 0; i < mx; i++) {
1018 ::VariantInit(&varArray[i]);
1019 varArray[i].vt = VT_I2;
1020 varArray[i].iVal = (short)pBuf[i];
1025 else if (!lstrcmp(m_classname, WC_LISTVIEW)) {
1026 //
\83\8a\83X
\83g
\83r
\83\85\81[
\82Ì
\8dÅ
\8f\89\82Ì
\91I
\91ð
\83A
\83C
\83e
\83\80\82ð
\92T
\82·
1027 mx = ListView_GetSelectedCount(m_hWnd);
1028 varArray.resize(mx + 1);
1031 while ((nIdx = ListView_GetNextItem(m_hWnd, nIdx, LVNI_SELECTED)) != -1
1033 ::VariantInit(&varArray[i]);
1034 varArray[i].vt = VT_I2;
1035 varArray[i].iVal = (short)nIdx;
1040 //
\82»
\82ê
\88È
\8aO
\82Í
\83T
\83|
\81[
\83g
\8aO
1041 return Error(IDS_ERR_NOTSUPPORTCONTROL);
1044 //
\97ñ
\8b\93\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\90¶
\90¬
1045 CComObject<CComEnumVARIANT>* pCol = NULL;
1047 if (FAILED(hr = CComObject<CComEnumVARIANT>::CreateInstance(&pCol))) {
1050 pCol->Init(&varArray[0], &varArray[mx], pCol, AtlFlagCopy);
1052 return pCol->QueryInterface(pVal);
1056 STDMETHODIMP CControl::get_ItemSelectState(VARIANT idx, VARIANT *pVal)
1058 ::VariantInit(pVal);
1061 if (!m_hParent || !m_hWnd) {
1062 return Error(IDS_ERR_DESTROYED);
1067 if (SUCCEEDED(varIdx.ChangeType(VT_I2, &idx))) {
1071 if (!lstrcmp(m_classname, _TEXT("COMBOBOX"))) {
1072 //
\83R
\83\93\83{
\83{
\83b
\83N
\83X
\82Ì
\8c»
\8dÝ
\82Ì
\91I
\91ð
\82ð
\95Ô
\82·
1073 int nSel = ::SendMessage(m_hWnd, CB_GETCURSEL, 0, 0);
1074 //
\8ew
\92è
\82µ
\82½
\83A
\83C
\83e
\83\80\82Æ
\91I
\91ð
\82ª
\88ê
\92v
\82µ
\82Ä
\82¢
\82ê
\82Îtrue
1075 ret = (bool)((nSel == nIdx) ? true : false);
1077 else if (!lstrcmp(m_classname, _TEXT("LISTBOX"))) {
1078 //
\83\8a\83X
\83g
\83{
\83b
\83N
\83X
\82Ì
\8c»
\8dÝ
\82Ì
\91I
\91ð
\83A
\83C
\83e
\83\80\82ð
\95Ô
\82·
1079 if (!(m_style & LBS_MULTIPLESEL)) {
1080 //
\83V
\83\93\83O
\83\8b\83Z
\83\8c\83N
\83g
\82Ì
\8fê
\8d\87
1081 int nSel = ::SendMessage(m_hWnd, LB_GETCURSEL, 0, 0);
1082 //
\8ew
\92è
\82µ
\82½
\83A
\83C
\83e
\83\80\82Æ
\91I
\91ð
\82ª
\88ê
\92v
\82µ
\82Ä
\82¢
\82ê
\82Îtrue
1083 ret = (nSel == nIdx);
1086 //
\83}
\83\8b\83`
\83Z
\83\8c\83N
\83g
\82Ì
\8fê
\8d\87
1087 ret = ::SendMessage(m_hWnd, LB_GETSEL, nIdx, 0) > 0;
1090 else if (!lstrcmp(m_classname, WC_LISTVIEW)) {
1091 //
\83\8a\83X
\83g
\83r
\83\85\81[
\82Ì
\8ew
\92è
\83A
\83C
\83e
\83\80\82Ì
\91®
\90«
\82ð
\92²
\82×
\82é
1092 int mx = ListView_GetItemCount(m_hWnd);
1093 if (nIdx >= 0 && nIdx < mx) {
1094 UINT state = ListView_GetItemState(m_hWnd, nIdx, LVNI_SELECTED);
1095 ret = (state & LVNI_SELECTED) != 0;
1099 //
\82»
\82ê
\88È
\8aO
\82Í
\83T
\83|
\81[
\83g
\8aO
1100 return Error(IDS_ERR_NOTSUPPORTCONTROL);
1106 STDMETHODIMP CControl::put_ItemSelectState(VARIANT idx, VARIANT newVal)
1108 if (!m_hParent || !m_hWnd) {
1109 return Error(IDS_ERR_DESTROYED);
1114 if (SUCCEEDED(varIdx.ChangeType(VT_I2, &idx))) {
1118 bool bSelected = false;
1119 CComVariant varSelected;
1120 if (SUCCEEDED(varSelected.ChangeType(VT_I2, &newVal))) {
1121 bSelected = newVal.iVal != 0;
1124 if (!lstrcmp(m_classname, _TEXT("COMBOBOX"))) {
1125 //
\83R
\83\93\83{
\83{
\83b
\83N
\83X
\82Ì
\8c»
\8dÝ
\82Ì
\91I
\91ð
\82ð
\95Ï
\8dX
\82·
\82é
1126 ::SendMessage(m_hWnd, CB_SETCURSEL, bSelected ? nIdx : -1, 0);
1128 else if (!lstrcmp(m_classname, _TEXT("LISTBOX"))) {
1129 //
\83\8a\83X
\83g
\83{
\83b
\83N
\83X
\82Ì
\8c»
\8dÝ
\82Ì
\91I
\91ð
\83A
\83C
\83e
\83\80\82ð
\95Ô
\82·
1130 if (!(m_style & LBS_MULTIPLESEL)) {
1131 //
\83V
\83\93\83O
\83\8b\83Z
\83\8c\83N
\83g
\82Ì
\8fê
\8d\87
1132 ::SendMessage(m_hWnd, LB_SETCURSEL, bSelected ? nIdx : -1, 0);
1135 //
\83}
\83\8b\83`
\83Z
\83\8c\83N
\83g
1136 ::SendMessage(m_hWnd, LB_SETSEL, nIdx, bSelected);
1139 else if (!lstrcmp(m_classname, WC_LISTVIEW)) {
1140 //
\83\8a\83X
\83g
\83r
\83\85\81[
\82Ì
\8ew
\92è
\83A
\83C
\83e
\83\80\82Ì
\91®
\90«
\82ð
\92²
\82×
\82é
1141 int mx = ListView_GetItemCount(m_hWnd);
1142 if (nIdx >= 0 && nIdx < mx) {
1143 ListView_SetItemState(m_hWnd, nIdx, bSelected ? LVNI_SELECTED : 0, LVNI_SELECTED);
1147 //
\82»
\82ê
\88È
\8aO
\82Í
\83T
\83|
\81[
\83g
\8aO
1148 return Error(IDS_ERR_NOTSUPPORTCONTROL);
1153 STDMETHODIMP CControl::get_SelectedCount(short *pVal)
1156 if (!m_hParent || !m_hWnd) {
1157 return Error(IDS_ERR_DESTROYED);
1160 if (!lstrcmp(m_classname, _TEXT("COMBOBOX"))) {
1161 //
\83\8a\83X
\83g
\83{
\83b
\83N
\83X
\82Ì
\83J
\83E
\83\93\83g
1162 int nIdx = ::SendMessage(m_hWnd, CB_GETCURSEL, 0, 0);
1163 *pVal = (short)(nIdx >= 0 ? 1 : 0);
1165 else if (!lstrcmp(m_classname, _TEXT("LISTBOX"))) {
1166 //
\83\8a\83X
\83g
\83{
\83b
\83N
\83X
\82Ì
\83J
\83E
\83\93\83g
1167 if (!(m_style & LBS_MULTIPLESEL)) {
1168 int nIdx = ::SendMessage(m_hWnd, LB_GETCURSEL, 0, 0);
1169 *pVal = (short)(nIdx >= 0 ? 1 : 0);
1172 //
\83}
\83\8b\83`
\83Z
\83\8c\83N
\83g
1173 *pVal = (short)::SendMessage(m_hWnd, LB_GETSELCOUNT, 0, 0);
1176 else if (!lstrcmp(m_classname, WC_LISTVIEW)) {
1177 //
\83\8a\83X
\83g
\83r
\83\85\81[
\82Ì
\83J
\83E
\83\93\83g
1178 *pVal = (short)ListView_GetSelectedCount(m_hWnd);
1181 //
\82»
\82ê
\88È
\8aO
\82Í
\83T
\83|
\81[
\83g
\8aO
1182 return Error(IDS_ERR_NOTSUPPORTCONTROL);
1187 STDMETHODIMP CControl::get_TreeRoot(VARIANT *pVal)
1189 if (!m_hParent || !m_hWnd) {
1190 return Error(IDS_ERR_DESTROYED);
1192 ::VariantInit(pVal);
1193 if (!lstrcmp(m_classname, WC_TREEVIEW)) {
1194 CComObject<CTreeItem>* pItem = NULL;
1196 if (FAILED(hr = CComObject<CTreeItem>::CreateInstance(&pItem))) {
1200 HTREEITEM hItem = TreeView_GetRoot(m_hWnd);
1201 pItem->SetParam(m_hWnd, hItem);
1203 IUnknown* pUnk = NULL;
1204 if (FAILED(hr = pItem->QueryInterface(IID_IUnknown, (void**)&pUnk))) {
1208 pVal->vt = VT_UNKNOWN;
1209 pVal->punkVal = pUnk;
1214 void CControl::ListSort(int column)
1216 if (!m_hParent || !m_hWnd) {
1220 //
\82¨
\82È
\82¶
\83J
\83\89\83\80\82ð
\83\
\81[
\83g
\82µ
\82½
\8fê
\8d\87\82Í
\8bt
\8f\87\82Æ
\82·
\82é
1221 if (m_dLastSortColumn == column) {
1222 m_bSortReverse = !m_bSortReverse;
1225 m_bSortReverse = false;
1228 m_dLastSortColumn = column;
1229 m_typCompare = VT_EMPTY;
1230 //
\83\
\81[
\83g
\82ð
\8cÄ
\82Ñ
\8fo
\82·
1231 ListView_SortItems(m_hWnd, CompareFunc, (LPARAM)this);
1234 int CControl::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
1236 if (!lParam1 || !lParam2) {
1237 //
\83C
\83\8c\83M
\83\85\83\89\81[
\81B
\83f
\81[
\83^
\81[
\82ª
\82È
\82¢
\82Ì
\82Å
\94ä
\8ar
\95s
\89Â
\94\
1241 CControl* me = (CControl*)lParamSort;
1243 IObjectMap* pMap1 = (IObjectMap*)lParam1;
1244 IObjectMap* pMap2 = (IObjectMap*)lParam2;
1247 wsprintf(mes, _TEXT("SORT%d"), me->m_dLastSortColumn);
1248 CComVariant key(mes);
1250 CComVariant val1, val2;
1251 if (!me->m_bSortReverse) {
1252 pMap1->get_Value(key, &val1);
1253 pMap2->get_Value(key, &val2);
1256 pMap1->get_Value(key, &val2);
1257 pMap2->get_Value(key, &val1);
1260 if (me->m_typCompare == VT_EMPTY) {
1261 //
\82Ü
\82¾
\94ä
\8ar
\82ð
\8aJ
\8en
\82µ
\82Ä
\82¢
\82È
\82¢
\82È
\82ç
\94ä
\8ar
\83^
\83C
\83v
\82ð
\8c\88\92è
\82·
\82é
1262 me->m_typCompare = val1.vt;
1263 if (val1.vt != val2.vt) {
1264 me->m_typCompare = VT_BSTR;
1269 switch (me->m_typCompare) {
1272 val1.ChangeType(VT_UI1);
1273 val2.ChangeType(VT_UI1);
1274 ret = val1.bVal - val2.bVal;
1279 val1.ChangeType(VT_I2);
1280 val2.ChangeType(VT_I2);
1281 ret = val1.iVal - val2.iVal;
1286 val1.ChangeType(VT_I4);
1287 val2.ChangeType(VT_I4);
1288 ret = val1.lVal - val2.lVal;
1293 val1.ChangeType(VT_R4);
1294 val2.ChangeType(VT_R4);
1295 ret = val1.fltVal > val2.fltVal;
1300 val1.ChangeType(VT_R8);
1301 val2.ChangeType(VT_R8);
1302 ret = val1.dblVal > val2.dblVal;
1307 val1.ChangeType(VT_CY);
1308 val2.ChangeType(VT_CY);
1309 ret = (int)(val1.cyVal.int64 - val2.cyVal.int64); //FIXME:
\82æ
\82ë
\82µ
\82
\82È
\82¢
\81B
\8c¸
\8eZ
\8c\8b\89Ê
\82ª
\8c\85\82 \82Ó
\82ê
\82µ
\82½
\8fê
\8d\87\81A
\94ä
\8ar
\8aÖ
\90\94\82ª
\94j
\92]
\82·
\82é
\81B
\82È
\82¨
\82³
\82Ë
\82Î
\81B
1314 val1.ChangeType(VT_DATE);
1315 val2.ChangeType(VT_DATE);
1316 ret = val1.date > val2.date;
1321 if (SUCCEEDED(val1.ChangeType(VT_BSTR)) &&
1322 SUCCEEDED(val2.ChangeType(VT_BSTR))) {
1323 ret = lstrcmpW(val1.bstrVal, val2.bstrVal);
1333 void CControl::OnRClick()
1335 if (!m_hParent || !m_hWnd) {
1339 if (!lstrcmp(m_classname, WC_TREEVIEW)) {
1340 //
\83c
\83\8a\81[
\83r
\83\85\81[
\82Å
\82 \82ê
\82Î
\83h
\83\8d\83b
\83v
\83n
\83C
\83\89\83C
\83g
\82ð
\91I
\91ð
\82É
\82·
\82é
1341 HTREEITEM hItem = TreeView_GetDropHilight(m_hWnd);
1343 TreeView_SelectItem(m_hWnd, hItem);
1349 STDMETHODIMP CControl::get_ItemCheckState(VARIANT idx, BOOL *pVal)
1351 if (!m_hParent || !m_hWnd) {
1352 return Error(IDS_ERR_DESTROYED);
1355 if (lstrcmp(m_classname, WC_LISTVIEW)) {
1356 //
\83\8a\83X
\83g
\83r
\83\85\81[
\88È
\8aO
\82Í
\83T
\83|
\81[
\83g
\8aO
1357 return Error(IDS_ERR_NOTSUPPORTCONTROL);
1361 HRESULT hr = varIdx.ChangeType(VT_I2, &idx);
1367 if (m_afterstyle & LVS_EX_CHECKBOXES) {
1368 *pVal = ListView_GetCheckState(m_hWnd, varIdx.iVal) ? VB_TRUE : VB_FALSE;
1373 STDMETHODIMP CControl::put_ItemCheckState(VARIANT idx, BOOL newVal)
1375 if (!m_hParent || !m_hWnd) {
1376 return Error(IDS_ERR_DESTROYED);
1379 if (lstrcmp(m_classname, WC_LISTVIEW)) {
1380 //
\83\8a\83X
\83g
\83r
\83\85\81[
\88È
\8aO
\82Í
\83T
\83|
\81[
\83g
\8aO
1381 return Error(IDS_ERR_NOTSUPPORTCONTROL);
1385 HRESULT hr = varIdx.ChangeType(VT_I2, &idx);
1390 if (m_afterstyle & LVS_EX_CHECKBOXES) {
1391 ListView_SetCheckState(m_hWnd, varIdx.iVal, newVal);
1396 STDMETHODIMP CControl::DeleteSelectedItem()
1398 if (!m_hParent || !m_hWnd) {
1399 return Error(IDS_ERR_DESTROYED);
1402 if (!lstrcmp(m_classname, _TEXT("LISTBOX"))) {
1403 //
\83\8a\83X
\83g
\83{
\83b
\83N
\83X
\82Ì
\91I
\91ð
\8dí
\8f\9c
1404 CComVariant varRet, dmy;
1405 while (SUCCEEDED(get_CurrentSelectedItem(&varRet)) && varRet.vt != VT_EMPTY) {
1406 varRet.ChangeType(VT_I4);
1407 if (varRet.lVal < 0) {
1410 DeleteString(varRet, &dmy);
1413 else if (!lstrcmp(m_classname, WC_LISTVIEW)) {
1414 //
\83\8a\83X
\83g
\83r
\83\85\81[
\82Ì
\8dí
\8f\9c
1416 while ((nIdx = ListView_GetNextItem(m_hWnd, nIdx, LVNI_SELECTED)) != -1) {
1417 CComVariant varIdx((long)nIdx), dmy;
1418 DeleteString(varIdx, &dmy);
1423 //
\82»
\82ê
\88È
\8aO
\82Í
\83T
\83|
\81[
\83g
\8aO
1424 return Error(IDS_ERR_NOTSUPPORTCONTROL);
1429 STDMETHODIMP CControl::get_ItemText(VARIANT idx, BSTR *pVal)
1431 if (!m_hParent || !m_hWnd) {
1432 return Error(IDS_ERR_DESTROYED);
1437 if (SUCCEEDED(varIdx.ChangeType(VT_I2, &idx))) {
1442 return DISP_E_TYPEMISMATCH;
1446 if (!lstrcmp(m_classname, _TEXT("COMBOBOX"))) {
1447 //
\83R
\83\93\83z
\83{
\83b
\83N
\83X
\82©
\82ç
\95¶
\8e\9a\97ñ
\82ð
\8eæ
\93¾
\82·
\82é
1448 int siz = ::SendMessage(m_hWnd, CB_GETLBTEXTLEN, nIdx, 0);
1451 LPTSTR p = tmp.GetBufferSetLength(siz + 1);
1452 if (::SendMessage(m_hWnd, CB_GETLBTEXT, nIdx, (LPARAM)p) > 0) {
1457 else if (!lstrcmp(m_classname, _TEXT("LISTBOX"))) {
1458 //
\83\8a\83X
\83g
\82©
\82ç
\95¶
\8e\9a\97ñ
\82ð
\8eæ
\93¾
\82·
\82é
1459 int siz = ::SendMessage(m_hWnd, LB_GETTEXTLEN, nIdx, 0);
1462 LPTSTR p = tmp.GetBufferSetLength(siz + 1);
1463 if (::SendMessage(m_hWnd, LB_GETTEXT, nIdx, (LPARAM)p) > 0) {
1468 else if (!lstrcmp(m_classname, WC_LISTVIEW)) {
1469 CComVariant arg, text;
1472 if (SUCCEEDED(GetColumnText(idx, arg, &text))) {
1473 if (SUCCEEDED(text.ChangeType(VT_BSTR))) {
1479 //
\82»
\82ê
\88È
\8aO
\82Í
\83T
\83|
\81[
\83g
\8aO
1480 return Error(IDS_ERR_NOTSUPPORTCONTROL);
1482 *pVal = ret.Detach();
1486 STDMETHODIMP CControl::put_ItemText(VARIANT idx, BSTR newVal)
1488 if (!m_hParent || !m_hWnd) {
1489 return Error(IDS_ERR_DESTROYED);
1494 if (SUCCEEDED(varIdx.ChangeType(VT_I2, &idx))) {
1499 return DISP_E_BADINDEX;
1502 if (!lstrcmp(m_classname, WC_LISTVIEW)) {
1503 CComVariant arg, text;
1505 text = (BSTR)newVal;
1506 return SetColumnText(idx, arg, text);
1509 //
\82»
\82ê
\88È
\8aO
\82Í
\83T
\83|
\81[
\83g
\8aO
1510 return Error(IDS_ERR_NOTSUPPORTCONTROL);
1513 STDMETHODIMP CControl::SetClassEvent(BSTR name, VARIANT* pvarUnk)
1515 m_bstrClassEvent = name;
1516 GetThisInterface(pvarUnk);
1520 void CControl::GetClassEvent(BSTR *pEventName)
1522 *pEventName = m_bstrClassEvent.copy();
1525 STDMETHODIMP CControl::CreateChild(VARIANT text, VARIANT varItem, VARIANT* pvarUnk)
1527 ::VariantInit(pvarUnk);
1528 if (!m_hParent || !m_hWnd) {
1529 return Error(IDS_ERR_DESTROYED);
1532 //
\83A
\83C
\83e
\83\80\82Ì
\8c\9f\8fØ
1534 if (SUCCEEDED(tmp.ChangeType(VT_UNKNOWN, &varItem))) {
1535 ITreeItem * pItem = NULL;
1536 if (tmp.punkVal->QueryInterface(IID_ITreeItem, (void**)&pItem) != S_OK) {
1537 return DISP_E_UNKNOWNINTERFACE;
1540 IUnknown* pUnk = NULL;
1541 if (SUCCEEDED(pItem->Create(text, &pUnk))) {
1542 pvarUnk->vt = VT_UNKNOWN;
1543 pvarUnk->punkVal = pUnk;
1548 tmp.ChangeType(VT_VARIANT, &varItem);
1549 if (tmp.vt == VT_ERROR || tmp.vt == VT_NULL || tmp.vt == VT_EMPTY) {
1550 //
\83\8b\81[
\83g
\8fã
\82É
\83A
\83C
\83e
\83\80\82ð
\8dì
\90¬
\82·
\82é
1551 AddString(text, pvarUnk);
1554 return DISP_E_TYPEMISMATCH;