Эксперт
   
Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006
Репутация: 39 Всего: 146
|
там вопрос есть, а ответа на него нет Цитата(_hunter @ 5.2.2007, 12:02 ) | http://forum.vingrad.ru/topic-1595.html |
это для файлов, а мне надо для url. Я думаю, это делается через IDropTarget (OLE Drag & Drop) Код | #include <windows.h> #include <stdio.h>
char ClassName[]="MainWndClass";
class CDropTarget : public IDropTarget { public: CDropTarget();
/* IUnknown methods */ STDMETHOD(QueryInterface)(REFIID riid, void FAR* FAR* ppvObj); STDMETHOD_(ULONG, AddRef)(void); STDMETHOD_(ULONG, Release)(void);
/* IDropSource methods */ STDMETHOD(DragEnter)(IDataObject* pDataObject, DWORD grfKeyState,POINTL pt,DWORD* pdwEffect); STDMETHOD(DragOver)(DWORD grfKeyState, POINTL pt,DWORD* pdwEffect); STDMETHOD(DragLeave)(void); STDMETHOD(Drop)(IDataObject* pDataObject,DWORD grfKeyState,POINTL pt,DWORD* pdwEffect); private: ULONG m_refs; };
STDMETHODIMP CDropTarget::QueryInterface(REFIID iid, void FAR* FAR* ppv) { if(iid == IID_IUnknown || iid == IID_IDropTarget) { *ppv = this; ++m_refs; return NOERROR; } *ppv = NULL;
return E_NOINTERFACE; }
STDMETHODIMP_(ULONG) CDropTarget::AddRef(void) { OutputDebugString("CDropSource::AddRef\r\n");
return ++m_refs; }
STDMETHODIMP_(ULONG) CDropTarget::Release(void) { OutputDebugString("CDropSource::Release\r\n");
if(--m_refs == 0) { delete this; return 0; } return m_refs; }
//--------------------------------------------------------------------- // CDropTarget Constructor //--------------------------------------------------------------------- CDropTarget::CDropTarget() { m_refs = 1; }
//--------------------------------------------------------------------- // IDropTarget Methods //---------------------------------------------------------------------
STDMETHODIMP CDropTarget::DragEnter(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect) { OutputDebugString("CDropTarget::DragEnter\r\n"); return DROPEFFECT_MOVE; }
STDMETHODIMP CDropTarget::DragOver(DWORD grfKeyState, POINTL pt, DWORD* pdwEffect) { OutputDebugString("CDropTarget::DragOver\r\n"); return DROPEFFECT_MOVE; }
STDMETHODIMP CDropTarget::DragLeave(void) { OutputDebugString("CDropTarget::DragLeave\r\n"); return S_OK; }
STDMETHODIMP CDropTarget::Drop(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect) { MessageBox(NULL,"Hello Drop",NULL,MB_OK); return S_OK; }
long __stdcall MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, long lParam) { switch(uMsg) { case WM_CLOSE: PostQuitMessage(0); break; }
return DefWindowProc(hWnd, uMsg, wParam, lParam); }
LPDROPTARGET CreateDropTarget(void) { return ((LPDROPTARGET) new CDropTarget); }
void ShowHex(HWND hWnd, DWORD err) { char b[260]; sprintf(b, "0x%.8X", err); MessageBoxA(hWnd, b, 0, 0); }
int __stdcall WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int) { WNDCLASSEX wc; MSG msg; HWND hMainWnd; LPDROPTARGET lpdt; HRESULT r;
wc.cbClsExtra=0; wc.cbSize=sizeof(wc); wc.cbWndExtra=0; wc.hbrBackground=(HBRUSH)16; wc.hCursor=LoadCursor(0, IDC_ARROW); wc.hIcon=wc.hIconSm=0; wc.hInstance=hinst; wc.lpfnWndProc=MainWndProc; wc.lpszClassName=ClassName; wc.style=0; wc.lpszMenuName=0; RegisterClassEx(&wc); hMainWnd=CreateWindowEx(0, ClassName, ClassName, WS_OVERLAPPEDWINDOW | WS_VISIBLE, 200, 200, 250, 180, 0, 0, hinst, 0); DragAcceptFiles(hMainWnd, 1);
CoInitialize(0); lpdt = (LPDROPTARGET)CreateDropTarget();
r=RegisterDragDrop(hMainWnd, lpdt); ShowHex(hMainWnd, r); while(GetMessage(&msg, 0, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } lpdt->Release(); CoUninitialize(); return 0; } |
но код не работает, функция RegisterDragDrop возвращает код 0x8007000E (out of memory). Где может быть ошибка? Это сообщение отредактировал(а) 586 - 6.2.2007, 09:19
|