HWND SWELL_CreateDialog(SWELL_DialogResourceIndex *reshead, const char *resid, HWND parent, DLGPROC dlgproc, LPARAM param) { int forceStyles=0; // 1=resizable, 2=no minimize, 4=no close bool forceNonChild=false; if ((((INT_PTR)resid)&~0xf)==0x400000) { forceStyles = (int) (((INT_PTR)resid)&0xf); if (forceStyles) forceNonChild=true; resid=0; } SWELL_DialogResourceIndex *p=resById(reshead,resid); if (!p&&resid) return 0; RECT r={0,0,p?p->width : 300, p?p->height : 200}; HWND owner=NULL; if (!forceNonChild && parent && (!p || (p->windowTypeFlags&SWELL_DLG_WS_CHILD))) { } else { owner = parent; parent = NULL; // top level window } HWND__ *h = new HWND__(parent,0,&r,NULL,false,NULL,NULL); if (forceNonChild || (p && !(p->windowTypeFlags&SWELL_DLG_WS_CHILD))) { if ((forceStyles&1) || (p && (p->windowTypeFlags&SWELL_DLG_WS_RESIZABLE))) h->m_style |= WS_THICKFRAME|WS_CAPTION; else h->m_style |= WS_CAPTION; } else if (!p && !parent) h->m_style |= WS_CAPTION; else if (parent && (!p || (p->windowTypeFlags&SWELL_DLG_WS_CHILD))) h->m_style |= WS_CHILD; if (p) { p->createFunc(h,p->windowTypeFlags); if (p->title) SetWindowText(h,p->title); h->m_dlgproc = dlgproc; h->m_wndproc = SwellDialogDefaultWindowProc; //HWND hFoc=m_children; // while (hFoc && !hFoc->m_wantfocus) hFoc=hFoc->m_next; // if (!hFoc) hFoc=this; // if (dlgproc(this,WM_INITDIALOG,(WPARAM)hFoc,0)&&hFoc) SetFocus(hFoc); h->m_dlgproc(h,WM_INITDIALOG,0,param); } else { h->m_wndproc = (WNDPROC)dlgproc; h->m_wndproc(h,WM_CREATE,0,param); } return h; }
HMENU SWELL_LoadMenu(SWELL_MenuResourceIndex *head, const char *resid) { SWELL_MenuResourceIndex *p; if (!(p=resById(head,resid))) return 0; HMENU hMenu=CreatePopupMenu(); if (hMenu) p->createFunc(hMenu); return hMenu; }
int SWELL_DialogBox(SWELL_DialogResourceIndex *reshead, const char *resid, HWND parent, DLGPROC dlgproc, LPARAM param) { SWELL_DialogResourceIndex *p=resById(reshead,resid); if (resid) // allow modal dialogs to be created without template { if (!p||(p->windowTypeFlags&SWELL_DLG_WS_CHILD)) return -1; } int ret=-1; HWND hwnd = SWELL_CreateDialog(reshead,resid,parent,dlgproc,param); // create dialog if (hwnd) { ReleaseCapture(); // force end of any captures WDL_PtrList<HWND__> enwnds; extern HWND__ *SWELL_topwindows; HWND a = SWELL_topwindows; while (a) { if (a->m_enabled && a != hwnd) { EnableWindow(a,FALSE); enwnds.Add(a); } a = a->m_next; } modalDlgRet r = { hwnd,false, -1 }; s_modalDialogs.Add(&r); ShowWindow(hwnd,SW_SHOW); while (s_modalDialogs.Find(&r)>=0 && !r.has_ret) { void SWELL_RunMessageLoop(); SWELL_RunMessageLoop(); Sleep(10); } ret=r.ret; s_modalDialogs.Delete(s_modalDialogs.Find(&r)); a = SWELL_topwindows; while (a) { if (!a->m_enabled && a != hwnd && enwnds.Find(a)>=0) EnableWindow(a,TRUE); a = a->m_next; } } // while in list, do something return ret; }