#include "StdAfx.h" #include "userdialog.h" // CUserDialog #include "resource.h" // IDD_ ... #include // assert() #include "ImageCompiler.h" // CImageCompiler #include "RelativeMouseInput.h" // CRelativeMouseInput #include // ComboBox_GetCurSel #include // TCITEM #include #include "ICfgFile.h" // Class name for this application's window class. #define WINDOW_CLASSNAME "UserDialog" // constructor CUserDialog::CUserDialog( void ) :m_iPreviewWidth(256), m_iPreviewHeight(256) { m_pImageCompiler=0; m_fShiftX=0.5f;m_fShiftY=0.5f; m_iScale16=16; m_hTab_Normalmapgen=0; m_hTab_Saveformat=0; m_hWindow=0; } // destructor CUserDialog::~CUserDialog( void ) { assert(!m_pImageCompiler); // should be 0 outside of DoModal call } //**************************************************************************** // // FUNCTION: CenterWindow (HWND, HWND) // // PURPOSE: Center one window over another // // COMMENTS: // // Dialog boxes take on the screen position that they were designed at, // which is not always appropriate. Centering the dialog over a particular // window usually results in a better position. // //*************************************************************************** void CenterWindow( HWND hwndChild, HWND hwndParent=0 ) { RECT rChild, rParent; int wChild, hChild, wParent, hParent; int wScreen, hScreen, xNew, yNew; HDC hdc; // Get the Height and Width of the child window GetWindowRect (hwndChild, &rChild); wChild = rChild.right - rChild.left; hChild = rChild.bottom - rChild.top; // Get the display limits hdc = GetDC (hwndChild); wScreen = GetDeviceCaps (hdc, HORZRES); hScreen = GetDeviceCaps (hdc, VERTRES); ReleaseDC (hwndChild, hdc); // Get the Height and Width of the parent window if(hwndParent) { GetWindowRect (hwndParent, &rParent); wParent = rParent.right - rParent.left; hParent = rParent.bottom - rParent.top; } else // 0 means it's the screen { wParent = wScreen; hParent = hScreen; rParent.left=0; rParent.top=0; } // Calculate new X position, then adjust for screen xNew = rParent.left + ((wParent - wChild) /2); if(xNew<0) xNew = 0; else if((xNew+wChild)>wScreen) xNew = wScreen - wChild; // Calculate new Y position, then adjust for screen yNew = rParent.top + ((hParent - hChild) /2); if(yNew<0) yNew = 0; else if((yNew+hChild)>hScreen) yNew = hScreen - hChild; // Set it, and return // SetWindowPos(hwndChild, NULL, xNew, yNew, 0, 0, SWP_NOSIZE | SWP_NOZORDER); MoveWindow(hwndChild, xNew, yNew, wChild, hChild, TRUE); } bool CUserDialog::DoModal( CImageCompiler *inpImageCompiler ) { m_pImageCompiler=inpImageCompiler; m_fShiftX=0.5f; m_fShiftY=0.5f; m_iScale16=16; // 1:1 // zoom out if image is too big { int iTexWidth=(int)m_pImageCompiler->GetWidth(), iTexHeight=(int)m_pImageCompiler->GetHeight(); while((iTexWidth>256 || iTexHeight>256) && m_iScale16!=1) { iTexWidth>>=1; iTexHeight>>=1; m_iScale16>>=1; } } m_hWindow=CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_USERDIALOG),0,CUserDialog::WndProc); if( !m_hWindow ) { DWORD h=GetLastError(); m_pImageCompiler=0; return(false); } // store this pointer SetWindowLongPtr(m_hWindow,DWL_USER,(LONG)(LONG_PTR)this); // CenterWindow(m_hWindow); // here I can't see my tab items CreateDialogItems(); CenterWindow(m_hWindow); // here it's moving SetDataToDialog(); UpdateWindowTitle(); UpdatePreview(); // call after IDC_PIXELFORMAT is created and image conversion is done ShowWindow(m_hWindow,SW_SHOW); // message loop { MSG Msg; while(GetMessage(&Msg, NULL, 0, WM_USER)) { if (WM_CLOSE == Msg.message) break; else { TranslateMessage(&Msg); DispatchMessage(&Msg); } } } DestroyWindow(m_hWindow); m_hWindow=0; m_pImageCompiler=0; return(true); } void CUserDialog::CreateDialogItems( void ) { // tab control { HWND hwnd=GetDlgItem(m_hWindow,IDC_PROPTAB);assert(hwnd); TCITEM tie; RECT wnp; tie.mask = TCIF_TEXT | TCIF_IMAGE; tie.iImage = -1; tie.pszText = "Normalmap"; TabCtrl_InsertItem(hwnd,0,&tie); tie.pszText = "File Output"; TabCtrl_InsertItem(hwnd,1,&tie); TabCtrl_SetCurSel(hwnd,1); GetWindowRect(hwnd,&wnp); // sub windows m_hTab_Normalmapgen=CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_TAB_NORMALMAPGEN),m_hWindow,CUserDialog::WndProcRedirect);assert(m_hTab_Normalmapgen); SetWindowPos(m_hTab_Normalmapgen, HWND_TOP, wnp.left, wnp.top, 0,0,SWP_NOSIZE); m_hTab_Saveformat=CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_TAB_SAVEFORMAT),m_hWindow,CUserDialog::WndProcRedirect); assert(m_hTab_Saveformat); SetWindowPos(m_hTab_Saveformat, HWND_TOP, wnp.left, wnp.top, 0,0,SWP_NOSIZE); // make dialog visible and set right tab SetPropertyTab(1); } // templates { HWND hwnd=GetDlgItem(m_hWindow,IDC_TEMPLATECOMBO);assert(hwnd); // Baustelle SendMessage(hwnd,CB_ADDSTRING,0,(LPARAM)""); for(int i = 1;; i++) { const char *name = m_pImageCompiler->m_pCC->presets->GetSectionName(i); if(!name) break; SendMessage(hwnd, CB_ADDSTRING, 0,(LPARAM)name); }; /* SendMessage(hwnd,CB_ADDSTRING,0,(LPARAM)"Skybox"); SendMessage(hwnd,CB_ADDSTRING,0,(LPARAM)"Normalmap_low"); SendMessage(hwnd,CB_ADDSTRING,0,(LPARAM)"Normalmap_high"); SendMessage(hwnd,CB_ADDSTRING,0,(LPARAM)"Texture_low"); SendMessage(hwnd,CB_ADDSTRING,0,(LPARAM)"Texture_high"); */ SendMessage(hwnd,CB_SETCURSEL,0,0); // first 0 is setting the used template } // pixelformats { HWND hwnd=GetDlgItem(m_hTab_Saveformat,IDC_PIXELFORMAT);assert(hwnd); CString sEntry; int iCount=m_pImageCompiler->GetPixelFormatCount(); for(int i=0;iGetPixelFormatName(i)); UpdatePixelFormatDesc(); } // mipmaps { HWND hwnd=GetDlgItem(m_hTab_Saveformat,IDC_MIPMAPS);assert(hwnd); SendMessage(hwnd,CB_ADDSTRING,0,(LPARAM)"max(1)"); SendMessage(hwnd,CB_ADDSTRING,0,(LPARAM)"none(0)"); } // reduce resolution { HWND hwnd=GetDlgItem(m_hTab_Saveformat,IDC_REDUCERES);assert(hwnd); SendMessage(hwnd,CB_ADDSTRING,0,(LPARAM)"none"); SendMessage(hwnd,CB_ADDSTRING,0,(LPARAM)"1 (1/4 memory)"); SendMessage(hwnd,CB_ADDSTRING,0,(LPARAM)"2 (1/16 memory)"); } // dither mode { HWND hwnd=GetDlgItem(m_hTab_Saveformat,IDC_DITHERMODE);assert(hwnd); SendMessage(hwnd,CB_ADDSTRING,0,(LPARAM)"none(0)"); SendMessage(hwnd,CB_ADDSTRING,0,(LPARAM)"simple(1)"); } } void CUserDialog::SetDataToDialog( void ) { HWND hwnd; bool isnotpreset = m_pImageCompiler->m_Props.m_sPreset==""; // preview part in main window hwnd=GetDlgItem(m_hWindow,IDC_PREVIEWALPHA);assert(hwnd); Button_SetCheck(hwnd,m_pImageCompiler->m_Props.m_bPreviewAlpha?1:0); hwnd=GetDlgItem(m_hWindow,IDC_PREVIEWFILTERED);assert(hwnd); Button_SetCheck(hwnd,m_pImageCompiler->m_Props.m_bPreviewFiltered?1:0); hwnd=GetDlgItem(m_hWindow,IDC_PREVIEWTILED);assert(hwnd); Button_SetCheck(hwnd,m_pImageCompiler->m_Props.m_bPreviewTiled?1:0); // main window: hwnd=GetDlgItem(m_hWindow,IDC_SHOWUSERDIALOG);assert(hwnd); Button_SetCheck(hwnd,m_pImageCompiler->m_Props.m_bUserDialog?1:0); EnableWindow(hwnd, isnotpreset); hwnd=GetDlgItem(m_hWindow,IDC_TEMPLATECOMBO);assert(hwnd); SendMessage(hwnd,CB_SETCURSEL,m_pImageCompiler->m_pCC->presets->Find(m_pImageCompiler->m_Props.m_sPreset),0); // sub window: save format hwnd=GetDlgItem(m_hTab_Saveformat,IDC_DITHERMODE);assert(hwnd); SendMessage(hwnd,CB_SETCURSEL,m_pImageCompiler->m_Props.m_dwDitherMode,0); EnableWindow(hwnd, isnotpreset); hwnd=GetDlgItem(m_hTab_Saveformat,IDC_MIPMAPS);assert(hwnd); SendMessage(hwnd,CB_SETCURSEL,m_pImageCompiler->m_Props.m_bMipmaps?0:1,0); EnableWindow(hwnd, isnotpreset); hwnd=GetDlgItem(m_hTab_Saveformat,IDC_REDUCERES);assert(hwnd); SendMessage(hwnd,CB_SETCURSEL,m_pImageCompiler->m_Props.m_dwReduceResolution,0); EnableWindow(hwnd, isnotpreset); hwnd=GetDlgItem(m_hTab_Saveformat,IDC_PIXELFORMAT);assert(hwnd); SendMessage(hwnd,CB_SETCURSEL,m_pImageCompiler->m_Props.m_iDestPixelFormat,0); EnableWindow(hwnd, isnotpreset); } void CUserDialog::GetDataFromDialog( void ) { HWND hwnd; // preview part in main window hwnd=GetDlgItem(m_hWindow,IDC_PREVIEWALPHA);assert(hwnd); m_pImageCompiler->m_Props.m_bPreviewAlpha=Button_GetCheck(hwnd)!=0; hwnd=GetDlgItem(m_hWindow,IDC_PREVIEWFILTERED);assert(hwnd); m_pImageCompiler->m_Props.m_bPreviewFiltered=Button_GetCheck(hwnd)!=0; hwnd=GetDlgItem(m_hWindow,IDC_PREVIEWTILED);assert(hwnd); m_pImageCompiler->m_Props.m_bPreviewTiled=Button_GetCheck(hwnd)!=0; // main window: hwnd=GetDlgItem(m_hWindow,IDC_SHOWUSERDIALOG);assert(hwnd); m_pImageCompiler->m_Props.m_bUserDialog=Button_GetCheck(hwnd)!=0; hwnd=GetDlgItem(m_hWindow,IDC_TEMPLATECOMBO);assert(hwnd); const char *pname = m_pImageCompiler->m_pCC->presets->GetSectionName(ComboBox_GetCurSel(hwnd)); m_pImageCompiler->m_Props.m_sPreset = pname ? pname : ""; // sub window: save format hwnd=GetDlgItem(m_hTab_Saveformat,IDC_PIXELFORMAT);assert(hwnd); m_pImageCompiler->m_Props.m_iDestPixelFormat=ComboBox_GetCurSel(hwnd); hwnd=GetDlgItem(m_hTab_Saveformat,IDC_MIPMAPS);assert(hwnd); m_pImageCompiler->m_Props.m_bMipmaps=(ComboBox_GetCurSel(hwnd)==0); hwnd=GetDlgItem(m_hTab_Saveformat,IDC_REDUCERES);assert(hwnd); m_pImageCompiler->m_Props.m_dwReduceResolution=ComboBox_GetCurSel(hwnd); hwnd=GetDlgItem(m_hTab_Saveformat,IDC_DITHERMODE);assert(hwnd); m_pImageCompiler->m_Props.m_dwDitherMode=ComboBox_GetCurSel(hwnd); m_pImageCompiler->SetPresetSettings(); } void CUserDialog::UpdateWindowTitle( void ) { assert(m_pImageCompiler); CString Zoom; Zoom.Format(" Zoom:%d%%",(100*m_iScale16)/16); CString title=m_pImageCompiler->GetSourceFilename() + Zoom; SetWindowText(m_hWindow,title.GetBuffer()); } // void CUserDialog::Draw( HDC inHdc ) { int iGap=4; int iTexWidth=(int)m_pImageCompiler->GetWidth(); int iTexHeight=(int)m_pImageCompiler->GetHeight(); RECT rec; rec.left=0; rec.top=0; rec.right=rec.left+m_iPreviewWidth; rec.bottom=rec.top+m_iPreviewHeight; // left side = original assert(m_pImageCompiler); if(!m_pImageCompiler->BlitTo(m_hWindow,rec,m_fShiftX,m_fShiftY,m_iScale16,true)) FillRect(inHdc,&rec,GetSysColorBrush(COLOR_3DFACE)); rec.left=m_iPreviewWidth+iGap*2+1; rec.right=rec.left+m_iPreviewWidth; // right side = destination assert(m_pImageCompiler); if(!m_pImageCompiler->BlitTo(m_hWindow,rec,m_fShiftX,m_fShiftY,m_iScale16,false)) FillRect(inHdc,&rec,GetSysColorBrush(COLOR_3DFACE)); } void CUserDialog::MouseMessage( const DWORD indwButtons, const int iniRelX , const int iniRelY, int iniRelZ ) { assert(m_pImageCompiler); int iWidth=(int)m_pImageCompiler->GetWidth(),iHeight=(int)m_pImageCompiler->GetHeight(); float fOldShiftX=m_fShiftX,fOldShiftY=m_fShiftY; int iOldScale16=m_iScale16; m_fShiftX-=iniRelX*(16.0f/m_iScale16/iWidth); m_fShiftY-=iniRelY*(16.0f/m_iScale16/iHeight); while(iniRelZ) { if(iniRelZ>0) { m_iScale16/=2; iniRelZ-=WHEEL_DELTA; } else { m_iScale16*=2; iniRelZ+=WHEEL_DELTA; } } if(m_iScale16<4) m_iScale16=4; if(m_iScale16>16*16) m_iScale16=16*16; bool bNoMovementPossible = m_pImageCompiler->ClampBlitOffset(m_iPreviewWidth,m_iPreviewHeight,m_fShiftX,m_fShiftY,m_iScale16); if(fOldShiftX!=m_fShiftX || fOldShiftY!=m_fShiftY || iOldScale16!=m_iScale16) { UpdateWindowTitle(); // Zoom:%d RECT rect; GetClientRect(m_hWindow,&rect); rect.bottom=m_iPreviewHeight; // update window InvalidateRect(m_hWindow,&rect,bNoMovementPossible); UpdateWindow(m_hWindow); } } void CUserDialog::UpdatePixelFormatDesc( void ) { HWND hwnds=GetDlgItem(m_hTab_Saveformat,IDC_PIXELFORMATDESC); assert(hwnds); SetWindowText(hwnds,m_pImageCompiler->GetPixelFormatDesc(m_pImageCompiler->m_Props.m_iDestPixelFormat)); } void CUserDialog::UpdatePreview( void ) { // preview images { RECT rect; GetClientRect(m_hWindow,&rect); rect.bottom=m_iPreviewHeight; // do image conversion if(m_pImageCompiler->RunWithProperties(false)) InvalidateRect(m_hWindow,&rect,false); // don't erase background else InvalidateRect(m_hWindow,&rect,true); // erase background } // info text { HWND hwndc=GetDlgItem(m_hTab_Saveformat,IDC_PIXELFORMAT); assert(hwndc); int iNo=ComboBox_GetCurSel(hwndc); CString sLeftInfo=m_pImageCompiler->GetInfoString(true); CString sRightInfo=m_pImageCompiler->GetInfoString(false); HWND hwnd1=GetDlgItem(m_hWindow,IDC_LEFTPREVIEWINFO); assert(hwnd1); HWND hwnd2=GetDlgItem(m_hWindow,IDC_RIGHTPREVIEWINFO); assert(hwnd2); SetWindowText(hwnd1,sLeftInfo.GetBuffer()); SetWindowText(hwnd2,sRightInfo.GetBuffer()); } } void CUserDialog::SetPropertyTab( const int iniNo ) { assert(iniNo>=0 && iniNo<=1); assert(m_hTab_Normalmapgen); assert(m_hTab_Saveformat); ShowWindow(m_hTab_Normalmapgen,iniNo==0 ? SW_SHOW:SW_HIDE); ShowWindow(m_hTab_Saveformat,iniNo==1 ? SW_SHOW:SW_HIDE); } /* //----------------------------------------------------------------------------- // Name: WndProc() // Desc: Static msg handler which passes messages to the application class. //----------------------------------------------------------------------------- LRESULT CALLBACK CUserDialog::WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) */ // WndProc vom Treiber auswahl Dialog BOOL CALLBACK CUserDialog::WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { CUserDialog *This=(CUserDialog *)(LONG_PTR)GetWindowLongPtr(hWnd,DWL_USER); switch(uMsg) { case WM_NOTIFY: { WORD wID=LOWORD(wParam); switch(wID) { case IDC_PROPTAB: { HWND hwnd=GetDlgItem(hWnd,IDC_PROPTAB); assert(hwnd); int iPage = TabCtrl_GetCurSel(hwnd); This->SetPropertyTab(iPage); } return(TRUE); } } return(FALSE); case WM_COMMAND: // { WORD wID=LOWORD(wParam); switch(wID) { case IDOK: This->GetDataFromDialog(); This->m_pImageCompiler->RunWithProperties(true); if(!This->m_pImageCompiler->UpdateAndSaveConfigFile()) MessageBox(0,"Error while saving the config file (write protected?)","ResourceCompiler Image Error",MB_OK); SendMessage(hWnd,WM_CLOSE,0,0); return(TRUE); case IDCANCEL: PostQuitMessage(0); return(TRUE); case IDC_ZOOMIN: This->MouseMessage(0,0,0,-WHEEL_DELTA); return(TRUE); case IDC_ZOOMOUT: This->MouseMessage(0,0,0,WHEEL_DELTA); return(TRUE); case IDC_TEMPLATECOMBO: case IDC_DITHERMODE: // dithering mode has changed case IDC_REDUCERES: // reduce resolution has changed case IDC_MIPMAPS: // mipmaps has changed case IDC_PIXELFORMAT: // pixelformat has changed if(HIWORD(wParam)==CBN_SELCHANGE) { This->GetDataFromDialog(); This->UpdatePixelFormatDesc(); This->SetDataToDialog(); This->UpdatePreview(); UpdateWindow(This->m_hWindow); } return(TRUE); case IDC_PREVIEWALPHA: case IDC_PREVIEWTILED: case IDC_PREVIEWFILTERED: { This->GetDataFromDialog(); This->UpdatePreview(); UpdateWindow(This->m_hWindow); } return(TRUE); } } return(TRUE); case WM_PAINT: // { assert(This); if(!This)return(FALSE); PAINTSTRUCT ps; HDC hdc = BeginPaint (hWnd, &ps); This->Draw(hdc); //,ps.rcPaint); // This->Draw(hdc,rChild.right-rChild.left,rChild.bottom-rChild.top); //,ps.rcPaint); EndPaint (hWnd, &ps); } return(TRUE); case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_MBUTTONDOWN: { assert(This); if(!This)return(FALSE); int iY=(int)HIWORD(lParam); if(iY<=This->m_iPreviewHeight) { This->m_RelMouse.OnButtonDown(hWnd); SetFocus(This->m_hWindow); } } return(TRUE); case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: { assert(This); if(!This)return(FALSE); if(wParam==0) This->m_RelMouse.OnButtonUp(); } return(TRUE); case WM_MOUSEMOVE: { assert(This); if(!This)return(FALSE); bool bButtonDown=(wParam&MK_LBUTTON)!=0 || (wParam&MK_MBUTTON)!=0 || (wParam&MK_RBUTTON)!=0; int iY=(int)HIWORD(lParam); if(iY<=This->m_iPreviewHeight || This->m_RelMouse.IsCaptured()) { int relX,relY; This->m_RelMouse.OnMouseMove(hWnd,bButtonDown,relX,relY); This->MouseMessage((DWORD)wParam,relX,relY,0); } } return(TRUE); case WM_MOUSEWHEEL: { assert(This); if(!This)return(FALSE); int zDelta = GET_WHEEL_DELTA_WPARAM(wParam); This->MouseMessage(0,0,0,-zDelta); } return(TRUE); case WM_CLOSE: PostQuitMessage(0); return (TRUE); // case WM_ERASEBKGND: // // return(TRUE); } // return DefWindowProc( hWnd, uMsg, wParam, lParam ); return(FALSE); } // redirect to the parent window BOOL CALLBACK CUserDialog::WndProcRedirect( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { HWND hParent=GetParent(hWnd); if(hParent) return(SendMessage(hParent,uMsg,wParam,lParam)!=0?TRUE:FALSE); // return DefWindowProc( hWnd, uMsg, wParam, lParam ); return(FALSE); }