void CListSide::AddLineAt(int nLine) { AddLine(); int nrLines = m_Lines.size(); for (int i = nrLines - 2; i>= nLine; i--) { HWND hWnd = m_Lines.at(i).edSecond.m_hWnd; int len = GetWindowTextLengthA(hWnd); char* str = NULL; if (len) { len++; str = new char[len]; GetWindowTextA(hWnd, str, len); SetWindowTextA(hWnd, "0:00"); hWnd = m_Lines.at(i+1).edSecond.m_hWnd; SetWindowTextA(hWnd, str); delete[] str; } hWnd = m_Lines.at(i).edText.m_hWnd; len = GetWindowTextLengthA(hWnd); if (len) { len++; str = new char[len]; GetWindowTextA(hWnd, str, len); SetWindowTextA(hWnd, ""); hWnd = m_Lines.at(i+1).edText.m_hWnd; SetWindowTextA(hWnd, str); delete[] str; } } }
void CIPMessage::Puts(HWND hW, int ID_EDIT, char *str) { int nLen = GetWindowTextLengthA(GetDlgItem(hW, ID_EDIT)); SendMessageA(GetDlgItem(hW, ID_EDIT), EM_SETSEL, nLen, nLen); SendMessageA(GetDlgItem(hW, ID_EDIT), EM_REPLACESEL, TRUE, (long)(LPCTSTR)str); nLen = GetWindowTextLengthA(GetDlgItem(hW, ID_EDIT)); SendMessageA(GetDlgItem(hW, ID_EDIT), EM_SETSEL, nLen, nLen); SendMessageA(GetDlgItem(hW, ID_EDIT), EM_REPLACESEL, TRUE, (long)(LPCTSTR)"\r\n"); }
void TextInput::set_focus() { BaseWindow::set_focus(); HWND hwnd = BaseWindow::get_handle(); st len = GetWindowTextLengthA(hwnd); SendMessage(hwnd, EM_SETSEL, len, len); }
BOOL CALLBACK CWindowsFunctions::CB_EnumChildProc(HWND hwnd, LPARAM lParam) { int length = GetWindowTextLengthA(hwnd); if (length > 0) { length++; // NULL character char* jpn = new char[length]; length = GetWindowTextA(hwnd, jpn, length); if (length > 0) { char className[6]; GetClassNameA(hwnd, className, sizeof(className)); if (strcmp(className, "Edit") != 0) { bool result = m_resources->TranslateUserInterface(jpn, m_uiBuffer, UI_BUFFER); if (result) { SetWindowTextA(hwnd, m_uiBuffer); } } } delete[] jpn; } return TRUE; }
static VOID DoSaveFile(VOID) { HANDLE hFile; DWORD dwNumWrite; LPSTR pTemp; DWORD size; hFile = CreateFile(Globals.szFileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hFile == INVALID_HANDLE_VALUE) { ShowLastError(); return; } size = GetWindowTextLengthA(Globals.hEdit) + 1; pTemp = HeapAlloc(GetProcessHeap(), 0, size); if (!pTemp) { CloseHandle(hFile); ShowLastError(); return; } size = GetWindowTextA(Globals.hEdit, pTemp, size); if (!WriteFile(hFile, pTemp, size, &dwNumWrite, NULL)) ShowLastError(); else SendMessage(Globals.hEdit, EM_SETMODIFY, FALSE, 0); SetEndOfFile(hFile); CloseHandle(hFile); HeapFree(GetProcessHeap(), 0, pTemp); }
void CListSide::RemoveLineAt(int nLine) { int nrLines = m_Lines.size(); for (int i = nLine; i < nrLines; i++) { HWND hWnd = m_Lines.at(i).edSecond.m_hWnd; int len = GetWindowTextLengthA(hWnd); char* str = NULL; if (len) { len++; str = new char[len]; GetWindowTextA(hWnd, str, len); SetWindowTextA(hWnd, ""); hWnd = m_Lines.at(i-1).edSecond.m_hWnd; SetWindowTextA(hWnd, str); delete[] str; } hWnd = m_Lines.at(i).edText.m_hWnd; len = GetWindowTextLengthA(hWnd); if (len) { len++; str = new char[len]; GetWindowTextA(hWnd, str, len); SetWindowTextA(hWnd, ""); hWnd = m_Lines.at(i-1).edText.m_hWnd; SetWindowTextA(hWnd, str); delete[] str; } } RemoveLine(); /* RECT rect; GetWindowRect(m_Lines.back().edText.m_hWnd, &rect); POINT pt = {rect.right, rect.bottom}; ScreenToClient(m_hWnd, &pt); // int nBottom = m_rClient.top + m_Lines.back().nIndex * m_nLineHeight + m_nLineHeight; UpdateScrollBar(pt.y);*/ }
std::string GetText(HWND hWnd) { size_t len = GetWindowTextLengthA(hWnd) + 1; if (len != 0) { char *text = (char *)alloca(len); len = GetWindowTextA(hWnd, text, len); return std::string(text, len); } return std::string(); }
ZString Window::GetText() const { int length = GetWindowTextLengthA(m_hwnd) + 1; if (length == 0) { return ZString(); } else { char* pch = new char[length]; GetWindowTextA(m_hwnd, pch, length); ZString str(pch); delete[] pch; return str; } }
void SendQueue::recallFailed(const TWindowData *dat, int iEntry) const { int iLen = GetWindowTextLengthA(GetDlgItem(dat->hwnd, IDC_MESSAGE)); if(dat) { NotifyDeliveryFailure(dat); if (iLen == 0) { // message area is empty, so we can recall the failed message... SETTEXTEX stx = {ST_DEFAULT, 1200}; if (m_jobs[iEntry].dwFlags & PREF_UNICODE) SendDlgItemMessage(dat->hwnd, IDC_MESSAGE, EM_SETTEXTEX, (WPARAM)&stx, (LPARAM)&m_jobs[iEntry].sendBuffer[lstrlenA(m_jobs[iEntry].sendBuffer) + 1]); else { stx.codepage = (m_jobs[iEntry].dwFlags & PREF_UTF) ? CP_UTF8 : CP_ACP; SendDlgItemMessage(dat->hwnd, IDC_MESSAGE, EM_SETTEXTEX, (WPARAM)&stx, (LPARAM)m_jobs[iEntry].sendBuffer); } UpdateSaveAndSendButton(const_cast<TWindowData *>(dat)); SendDlgItemMessage(dat->hwnd, IDC_MESSAGE, EM_SETSEL, (WPARAM) - 1, (LPARAM) - 1); } } }
VDStringA VDGetWindowTextAW32(HWND hwnd) { char buf[512]; int len = GetWindowTextLengthA(hwnd); if (len > 511) { vdblock<char> tmp(len + 1); len = GetWindowTextA(hwnd, tmp.data(), tmp.size()); const char *s = tmp.data(); VDStringA text(s, s+len); return text; } else if (len > 0) { len = GetWindowTextA(hwnd, buf, 512); return VDStringA(buf, buf + len); } return VDStringA(); }
VDStringW VDGetWindowTextW32(HWND hwnd) { union { wchar_t w[256]; char a[512]; } buf; if (VDIsWindowsNT()) { int len = GetWindowTextLengthW(hwnd); if (len > 255) { vdblock<wchar_t> tmp(len + 1); len = GetWindowTextW(hwnd, tmp.data(), tmp.size()); VDStringW text(tmp.data(), len); return text; } else if (len > 0) { len = GetWindowTextW(hwnd, buf.w, 256); VDStringW text(buf.w, len); return text; } } else { int len = GetWindowTextLengthA(hwnd); if (len > 511) { vdblock<char> tmp(len + 1); len = GetWindowTextA(hwnd, tmp.data(), tmp.size()); VDStringW text(VDTextAToW(tmp.data(), len)); return text; } else if (len > 0) { len = GetWindowTextA(hwnd, buf.a, 512); VDStringW text(VDTextAToW(buf.a, len)); return text; } } return VDStringW(); }
static BOOL CALLBACK EnumWindowsProc(HWND Window, LPARAM lParam) { BOOL Result = TRUE; enum_data *EnumData = (enum_data*)lParam; window_data_pool *Pool = EnumData->Pool; HWND ComboBox = EnumData->ComboBox; if(!GetParent(Window)) { LONG_PTR Style = GetWindowLongPtrA(Window, GWL_STYLE); if(Style & WS_VISIBLE) { int TextLength = GetWindowTextLengthA(Window); if(TextLength > 0) { char Buffer[256]; if(GetWindowTextA(Window, Buffer, sizeof(Buffer))) { window_data *WndData = PushWindowData(Pool); if(WndData) { WndData->Style = Style; WndData->Window = Window; DWORD Pos = (DWORD)SendMessageA(ComboBox, CB_ADDSTRING, 0, (LPARAM)Buffer); SendMessageA(ComboBox, CB_SETITEMDATA, Pos, (LPARAM)WndData); } else { PRINT_ERR("Maximum window count reached.\n"); SetLastError(ENUM_ERR_ABORTED); return FALSE; } } else { PRINT_ERR("Could not get window title.\n"); } } else { PRINT_ERR("Could not get window text length.\n"); } } } return Result; }
//-------------------------------------------------------------------------- bool WindowsVideoDevice::_CreateWindowFrom(VeWindow::Data* pkWindow, const void* pvData) noexcept { VE_ASSERT(pkWindow && pvData); HWND hWnd = (HWND)pvData; VeInt32 i32TitleLen = GetWindowTextLengthA(hWnd); if (i32TitleLen > 0) { VeChar8* pcTitle = VeStackAlloc(VeChar8, i32TitleLen + 1); VE_ASSERT(pcTitle); i32TitleLen = GetWindowTextA(hWnd, pcTitle, i32TitleLen); VE_ASSERT(i32TitleLen > 0); pkWindow->m_kTitle = pcTitle; VeStackFree(pcTitle); } if (!SetupWindowData(pkWindow, hWnd, VE_FALSE)) { return false; } return true; }
void saveActiveWindow() { HWND active; char *name=malloc(256*sizeof(char)),*nAdded=malloc(256*sizeof(char)); while(1) { Sleep(10); active=GetForegroundWindow(); GetWindowTextA(active,name,GetWindowTextLengthA(active)+1); if(strcmp(name,nAdded)) { if(strlen(name)>1) { fprintf(log,"\n###### %s ######\n",name); Flush(); } strcpy(nAdded,name); printf("Test\n"); } } free(name); free(nAdded); }
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { static HWND hEdit1, hEdit2, hEdit3, hButton; static HWND hStatic1, hStatic2; static HWND hCheck; switch (msg) { case WM_CREATE: hStatic1 = CreateWindow(TEXT("Static"), TEXT("対象リスト"), WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, hWnd, 0, ((LPCREATESTRUCT)lParam)->hInstance, 0); hEdit1 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""), WS_VISIBLE | WS_CHILD | WS_TABSTOP | WS_VSCROLL | WS_HSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE | ES_WANTRETURN, 0, 0, 0, 0, hWnd, 0, ((LPCREATESTRUCT)lParam)->hInstance, 0); SendMessage(hEdit1, EM_LIMITTEXT, 0, 0); hCheck = CreateWindow(TEXT("Button"), TEXT("HTMLエスケープ"), WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_AUTOCHECKBOX, 0, 0, 0, 0, hWnd, 0, ((LPCREATESTRUCT)lParam)->hInstance, 0); hEdit3 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""), WS_VISIBLE | WS_CHILD | WS_TABSTOP | ES_AUTOHSCROLL, 0, 0, 0, 0, hWnd, 0, ((LPCREATESTRUCT)lParam)->hInstance, 0); hButton = CreateWindow(TEXT("Button"), TEXT(">変換>"), WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_DEFPUSHBUTTON, 0, 0, 0, 0, hWnd, (HMENU)IDOK, ((LPCREATESTRUCT)lParam)->hInstance, 0); hStatic2 = CreateWindow(TEXT("Static"), TEXT("結果リスト"), WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, hWnd, 0, ((LPCREATESTRUCT)lParam)->hInstance, 0); hEdit2 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""), WS_VISIBLE | WS_CHILD | WS_TABSTOP | WS_VSCROLL | WS_HSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE | ES_READONLY, 0, 0, 0, 0, hWnd, 0, ((LPCREATESTRUCT)lParam)->hInstance, 0); SendMessage(hEdit2, EM_LIMITTEXT, 0, 0); DragAcceptFiles(hWnd, TRUE); break; case WM_DROPFILES: { const HDROP hDrop = (HDROP)wParam; const UINT nFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0); if (nFiles == 1) { TCHAR szFileName[MAX_PATH]; DragQueryFile(hDrop, 0, szFileName, sizeof(szFileName)); const HANDLE hFile = CreateFile(szFileName, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hFile != INVALID_HANDLE_VALUE) { const DWORD dwFileSize = GetFileSize(hFile, 0); DWORD dwReadSize; LPSTR lpszText = (LPSTR)GlobalAlloc(0, dwFileSize + 1); ReadFile(hFile, lpszText, dwFileSize, &dwReadSize, 0); lpszText[dwReadSize] = 0; SetWindowTextA(hEdit1, lpszText); GlobalFree(lpszText); CloseHandle(hFile); } } DragFinish(hDrop); } break; case WM_SIZE: { const int button_width = 128; const int width = (LOWORD(lParam) - button_width - 20) / 2; MoveWindow(hStatic1, 0, 0, width, 32, TRUE); MoveWindow(hEdit1, 0, 32, width, HIWORD(lParam) - 32, TRUE); MoveWindow(hCheck, width + 10, HIWORD(lParam) / 2 - 16 - 10 - 32, button_width, 32, TRUE); MoveWindow(hEdit3, width + 10, HIWORD(lParam) / 2 - 16, button_width, 32, TRUE); MoveWindow(hButton, width + 10, HIWORD(lParam) / 2 + 16 + 10, button_width, 32, TRUE); MoveWindow(hStatic2, width + button_width + 20, 0, width, 32, TRUE); MoveWindow(hEdit2, width + button_width + 20, 32, width, HIWORD(lParam) - 32, TRUE); } break; case WM_COMMAND: if (LOWORD(wParam) == IDOK) { EnableWindow(hButton, FALSE); SetWindowTextA(hEdit2, 0); const INT_PTR nEditLineCount1 = SendMessageA(hEdit1, EM_GETLINECOUNT, 0, 0); const INT_PTR bHtmlEscape = SendMessageA(hCheck, BM_GETCHECK, 0, 0); LPSTR lpszEdit3 = 0; const int nEditLenght3 = GetWindowTextLengthA(hEdit3); if (nEditLenght3) { lpszEdit3 = (LPSTR)GlobalAlloc(0, sizeof(CHAR) * (nEditLenght3 + 1)); GetWindowTextA(hEdit3, lpszEdit3, nEditLenght3 + 1); } BOOL bIsFound; for (INT_PTR i = 0; i < nEditLineCount1; ++i) { bIsFound = FALSE; const INT_PTR nEditLineIndex1 = SendMessageA(hEdit1, EM_LINEINDEX, i, 0); const INT_PTR nEditLineLength1 = SendMessageA(hEdit1, EM_LINELENGTH, nEditLineIndex1, 0); if (!nEditLineLength1) continue; LPSTR lpszEditLine1 = (LPSTR)GlobalAlloc(0, sizeof(CHAR)* (nEditLineLength1 + 1 + 2)); // 改行文字2文字分追加 *(WORD *)lpszEditLine1 = (WORD)nEditLineLength1; SendMessageA(hEdit1, EM_GETLINE, i, (LPARAM)lpszEditLine1); lpszEditLine1[nEditLineLength1] = 0; { const std::string target(lpszEditLine1); std::regex re(R"(https?://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+)"); std::smatch match; for (auto it = target.begin(); regex_search(it, target.end(), match, re); it += match.position(0) + match.length(0)) { std::string str(match.str(0)); if (bHtmlEscape) { str = Replace(str, "&", "&"); str = Replace(str, "%3D", "="); str = Replace(str, "%22", "\""); str = Replace(str, "%20", " "); } if (!lpszEdit3 || StrStrIA(str.c_str(), lpszEdit3)) { INT_PTR dwEditTextLength = SendMessageA(hEdit2, WM_GETTEXTLENGTH, 0, 0); SendMessageA(hEdit2, EM_SETSEL, dwEditTextLength, dwEditTextLength); SendMessageA(hEdit2, EM_REPLACESEL, 0, (LPARAM)str.c_str()); SendMessageA(hEdit2, EM_REPLACESEL, 0, (LPARAM)"\r\n"); } } } GlobalFree(lpszEditLine1); } if (lpszEdit3) { GlobalFree(lpszEdit3); } SendMessageA(hEdit2, EM_SETSEL, 0, -1); SetFocus(hEdit2); EnableWindow(hButton, TRUE); } break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefDlgProc(hWnd, msg, wParam, lParam); } return 0; }
LRESULT CALLBACK CListSide::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_KEYDOWN: { int nScrollNotify = -1; bool bFoundT = false, bFoundS = false; HWND hEdit = GetFocus(); CListSide* pThis = (CListSide*)GetWindowLongPtrW(hWnd, GWL_USERDATA); deque<CListSide::LINE>::iterator I; for (I = pThis->m_Lines.begin(); I != pThis->m_Lines.end(); I++) { if (I->edText.m_hWnd == hEdit) { bFoundT = true; break; } if (I->edSecond.m_hWnd == hEdit) { bFoundS = true; break; } } switch (wParam) { case VK_SHIFT: break; case VK_NEXT: nScrollNotify = SB_PAGEDOWN; break; case VK_PRIOR: nScrollNotify = SB_PAGEUP; break; case VK_HOME: nScrollNotify = SB_TOP; break; case VK_END: nScrollNotify = SB_BOTTOM; break; case VK_UP: { if (I->nIndex != 0) { if (bFoundT) SetFocus(pThis->m_Lines.at(I->nIndex - 1).edText.m_hWnd); if (bFoundS) SetFocus(pThis->m_Lines.at(I->nIndex - 1).edSecond.m_hWnd); RECT rect; GetWindowRect(pThis->m_Lines[I->nIndex-1].edText.m_hWnd, &rect); POINT pt = {rect.left, rect.top}; ScreenToClient(hWnd, &pt); if (0 > pt.y || pThis->m_dPage < pt.y) pThis->ScrollTo(pt.y + pThis->m_dScrollPos); else { GetWindowRect(pThis->m_Lines[I->nIndex].edText.m_hWnd, &rect); pt.x = rect.left; pt.y = rect.top; ScreenToClient(hWnd, &pt); if (pt.y < 0) nScrollNotify = SB_LINEUP; } } } break; case VK_DOWN: { if (I->nIndex != pThis->m_Lines.back().nIndex) { if (bFoundT) SetFocus(pThis->m_Lines.at(I->nIndex + 1).edText.m_hWnd); if (bFoundS) SetFocus(pThis->m_Lines.at(I->nIndex + 1).edSecond.m_hWnd); RECT rect; GetWindowRect(pThis->m_Lines[I->nIndex + 1].edText.m_hWnd, &rect); POINT pt = {rect.right, rect.bottom}; ScreenToClient(hWnd, &pt); if (pThis->m_dScrollPos > pt.y || pThis->m_dScrollPos + pThis->m_dPage - 1 < pt.y) pThis->ScrollTo(pt.y + pThis->m_dScrollPos - pThis->m_dPage); else { GetWindowRect(pThis->m_Lines[I->nIndex].edText.m_hWnd, &rect); pt.x = rect.left; pt.y = rect.bottom; ScreenToClient(hWnd, &pt); if (pt.y >= pThis->m_dPage) nScrollNotify = SB_LINEDOWN; } } } break; default: { if (!bFoundT && !bFoundS) break; RECT rect; GetWindowRect(pThis->m_Lines[I->nIndex].edText.m_hWnd, &rect); POINT pt = {rect.left, rect.top}; ScreenToClient(hWnd, &pt); if (0 > pt.y || pThis->m_dPage < pt.y) pThis->ScrollTo(pt.y + pThis->m_dScrollPos); else { GetWindowRect(pThis->m_Lines[I->nIndex].edText.m_hWnd, &rect); pt.x = rect.left; pt.y = rect.top; ScreenToClient(hWnd, &pt); if (pt.y < 0) nScrollNotify = SB_LINEUP; } } break; } if (nScrollNotify!=-1) { SendMessage(hWnd, WM_VSCROLL, MAKEWPARAM(nScrollNotify,0), 0); } } break;//WM_KEYDOWN case WM_MOUSEWHEEL: { INT16 delta = (int)HIWORD(wParam); if (delta < 0) SendMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN,0), 0); else SendMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEUP,0), 0); } break; // case WM_PAINT: break; case WM_VSCROLL: OnVScroll(hWnd, wParam, lParam); break; case WM_ADDLINEAT: { CListSide* pThis = (CListSide*)GetWindowLongPtrW(hWnd, GWL_USERDATA); int nLine = LOWORD(wParam); int nSelEnd = HIWORD(wParam); HWND hEdit = (HWND)lParam; pThis->AddLineAt(nLine+1); int end = GetWindowTextLengthW(hEdit); SendMessage(hEdit, EM_SETSEL, (WPARAM)nSelEnd, (LPARAM)end); if (nSelEnd < end) { SendMessage(hEdit, WM_CUT, 0, 0); hEdit = pThis->m_Lines.at(nLine + 1).edText.m_hWnd; SendMessage(hEdit, WM_PASTE, 0, 0); } else hEdit = pThis->m_Lines.at(nLine + 1).edText.m_hWnd; SetFocus(hEdit); SendMessage(hEdit, EM_SETSEL, 0, 0); } break; case WM_DELLINEAT: { CListSide* pThis = (CListSide*)GetWindowLongPtrW(hWnd, GWL_USERDATA); int nLine = (int)wParam; HWND hEdit= (HWND)lParam; //1. copy the content from this line: int len = GetWindowTextLengthA(hEdit); len++; char* str = new char[len]; int len2; if (0 < len) { GetWindowTextA(hEdit, str, len); hEdit = pThis->m_Lines.at(nLine - 1).edText.m_hWnd; len2 = GetWindowTextLengthA(hEdit); len2++; char* str2 = new char[len2]; GetWindowTextA(hEdit, str2, len2); string sir = str2; sir += ' '; sir += str; SetWindowTextA(hEdit, sir.data()); delete[] str2; } else hEdit = pThis->m_Lines.at(nLine - 1).edText.m_hWnd; //2. move cursor to the editbox above pThis->RemoveLineAt(nLine+1); SetFocus(hEdit); SendMessage(hEdit, EM_SETSEL, len2, len2); delete[] str; } break; case WM_DELLINEDELAT: { //using DEL CListSide* pThis = (CListSide*)GetWindowLongPtrW(hWnd, GWL_USERDATA); int nLine = (int)wParam; HWND hEdit= (HWND)lParam; //1. copy the content from this line: int len = GetWindowTextLengthA(hEdit); len++; char* str = new char[len]; int len2; string sir; if (0 < len) { GetWindowTextA(hEdit, str, len); hEdit = pThis->m_Lines.at(nLine - 1).edText.m_hWnd; len2 = GetWindowTextLengthA(hEdit); len2++; char* str2 = new char[len2]; GetWindowTextA(hEdit, str2, len2); sir = str2; sir += ' '; sir += str; delete[] str2; } else hEdit = pThis->m_Lines.at(nLine - 1).edText.m_hWnd; //2. move cursor to the editbox above pThis->RemoveLineAt(nLine); SetWindowTextA(hEdit, sir.data()); SetFocus(hEdit); SendMessage(hEdit, EM_SETSEL, len2, len2); delete[] str; } break; case WM_SELECTLINE: { CListSide* pThis = (CListSide*)GetWindowLongPtrW(hWnd, GWL_USERDATA); if (pThis->m_bEnableLineSel == false) break; int nLine = (int)wParam; if (pThis->m_nSelLine > -1) { pThis->m_Lines.at(pThis->m_nSelLine).bSelected = false; RedrawWindow(pThis->m_Lines.at(pThis->m_nSelLine).edText.m_hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW); RedrawWindow(pThis->m_Lines.at(pThis->m_nSelLine).edSecond.m_hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW); } if (pThis->m_nSelLine != nLine) { pThis->m_nSelLine = nLine; pThis->m_Lines.at(nLine).bSelected = true; RedrawWindow(pThis->m_Lines.at(nLine).edText.m_hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW); RedrawWindow(pThis->m_Lines.at(nLine).edSecond.m_hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW); RECT rect; GetWindowRect(pThis->m_Lines[nLine].edText.m_hWnd, &rect); POINT pt = {rect.right, rect.bottom}; ScreenToClient(hWnd, &pt); if (pThis->m_dScrollPos > pt.y || pThis->m_dScrollPos + pThis->m_dPage - 1 < pt.y || pt.y >= pThis->m_dPage) pThis->ScrollTo(pt.y + pThis->m_dScrollPos - pThis->m_dPage); } else pThis->m_nSelLine = -1; } break;//WM_SELECTLINE case WM_CTLCOLOREDIT: { HDC hDC = (HDC)wParam; HWND hEdit = (HWND)lParam; HBRUSH hBrush = 0; CListSide* pThis = (CListSide*)GetWindowLongPtrW(hWnd, GWL_USERDATA); bool bFound = false; deque<CListSide::LINE>::iterator I; for (I = pThis->m_Lines.begin(); I != pThis->m_Lines.end(); I++) { if (hEdit == I->edSecond.m_hWnd || hEdit == I->edText.m_hWnd) { //we found the edit in the list if (I->bSelected) { //the edit is selected hBrush = CreateSolidBrush(RGB(0, 0, 255)); SetBkColor(hDC, RGB(0, 0, 255)); SetTextColor(hDC, RGB(255, 255, 255)); break; } else { //the edit is not selected hBrush = CreateSolidBrush(RGB(255, 255, 255)); SetBkColor(hDC, RGB(255, 255, 255)); SetTextColor(hDC, RGB(0, 0, 0)); } } //if we did not find the edit in the list, we keep searching, to know whether it is selected or not } return (LRESULT)hBrush; } break;//WM_CTLCOLOREDIT } return DefWindowProc(hWnd, uMsg, wParam, lParam); }
/* ---------------------------------------------------------------- Win\Gui\Window C API ------------------------------------------------------------------*/ int wingui_control_static_autosize(HWND handle, int style, int extrastyle, int x, int y TSRMLS_DC) { HDC dc; RECT rect; BOOL worked; UINT flags = DT_CALCRECT; dc = GetDC(handle); if (dc == 0) { goto error; } worked = GetClientRect(handle, &rect); if (worked == 0) { goto error; } /* get our flags right for drawtext */ if ((SS_CENTER & style) == SS_CENTER) { flags |= DT_CENTER; } else if ((SS_RIGHT & style) == SS_RIGHT) { flags |= DT_RIGHT; } else if ((SS_LEFT & style) == SS_LEFT) { flags |= DT_LEFT; } if ( ((WS_EX_RTLREADING & extrastyle) == WS_EX_RTLREADING) || ((WS_EX_LAYOUTRTL & extrastyle) == WS_EX_LAYOUTRTL) ) { flags |= DT_RTLREADING; } if ((SS_WORDELLIPSIS & style) == SS_WORDELLIPSIS) { flags |= DT_WORD_ELLIPSIS | DT_SINGLELINE; } else if ((SS_PATHELLIPSIS & style) == SS_PATHELLIPSIS) { flags |= DT_PATH_ELLIPSIS | DT_SINGLELINE; } else if ((SS_ENDELLIPSIS & style) == SS_ENDELLIPSIS) { flags |= DT_END_ELLIPSIS | DT_SINGLELINE; } if ((SS_NOPREFIX & style) == SS_NOPREFIX) { flags |= DT_NOPREFIX; } if ((SS_LEFTNOWORDWRAP & style) == SS_LEFTNOWORDWRAP) { flags |= DT_SINGLELINE; } else if ((SS_SIMPLE & style) == SS_SIMPLE) { flags |= DT_SINGLELINE; } else { flags |= DT_WORDBREAK; } if ((SS_EDITCONTROL & style) == SS_EDITCONTROL) { flags |= DT_EDITCONTROL; } if (IsWindowUnicode(handle)) { int length, worked_len; wchar_t * text; length = GetWindowTextLengthW(handle); text = safe_emalloc(length, sizeof(wchar_t), 1); worked_len = GetWindowTextW(handle, text, length + 1); if (worked_len == 0) { goto error; } worked = DrawTextW(dc, text, -1, &rect, flags); if (worked == 0) { goto error; } } else { int length, worked_len; char * text; length = GetWindowTextLengthA(handle); text = safe_emalloc(length, sizeof(char), 1); worked_len = GetWindowTextA(handle, text, length + 1); if (worked_len == 0) { goto error; } worked = DrawTextA(dc, text, -1, &rect, flags); if (worked == 0) { goto error; } } MoveWindow(handle, x, y, (rect.right - rect.left), (rect.bottom - rect.top), FALSE); ReleaseDC(handle, dc); return SUCCESS; error: ReleaseDC(handle, dc); winsystem_create_error(GetLastError(), ce_winsystem_runtimeexception TSRMLS_CC); return FAILURE; }
void CLyricsDlg::UpdateByTagIDV1(HWND hDlg) { if (m_bIsSet) { if (GetWindowTextLengthA(GetDlgItem(hDlg, IDC_ARTISTNAME)) != 0 || GetWindowTextLengthA(GetDlgItem(hDlg, IDC_ALBUMNAME)) != 0 || GetWindowTextLengthA(GetDlgItem(hDlg, IDC_SONGNAME)) != 0) { return; } } genDll.m_sSavingSong = genDll.m_sCurrentSong; static WCHAR wstrlast[MAX_PATH] = L""; //now we load the tagInfo and display what we have if (wcslen(genDll.m_sCurrentSong) > 0 && 0 != wcscmp(wstrlast, genDll.m_sCurrentSong)) { SetDlgItemTextA(hDlg, IDC_ARTISTNAME, ""); SetDlgItemTextA(hDlg, IDC_ALBUMNAME, ""); SetDlgItemTextA(hDlg, IDC_SONGNAME, ""); bool bArtist = false; bool bAlbum = false; bool bSong = false; wcscpy_s(wstrlast, MAX_PATH, genDll.m_sCurrentSong); //load open the file for reading: HANDLE hFile = CreateFile(wstrlast, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED , 0); if (hFile == INVALID_HANDLE_VALUE) { char errs[20]; DWORD dwError = GetLastError(); sprintf_s(errs, 20, "Error 0x%x", dwError); MessageBoxA(hDlg, errs, "Error!", MB_ICONERROR); #ifdef _DEBUG DebugBreak(); #endif return; } //so now, we have the file opened... we must load the last part of it: LARGE_INTEGER liSize; GetFileSizeEx(hFile, &liSize); DWORD dwRead; OVERLAPPED overl; memset(&overl, 0, sizeof(overl)); overl.Offset = (DWORD)liSize.LowPart - 128; overl.hEvent = 0; ReadFile(hFile, &m_tagInfo, 128, &dwRead, &overl); GetOverlappedResult(hFile, &overl, &dwRead, true); if (m_tagInfo.cT == 'T' && m_tagInfo.cA == 'A' && m_tagInfo.cG == 'G') { if (dwRead != 128) { DWORD dwError = GetLastError(); wsprintf(wstrlast, L"Error 0x%x", dwError); MessageBox(hDlg, wstrlast, L"Error!", MB_ICONERROR); #ifdef _DEBUG DebugBreak(); #endif EndDialog(hDlg, IDCANCEL); return; } m_tagInfo.sAlbumName[29] = m_tagInfo.sArtistName[29] = m_tagInfo.sSongName[29] = 0; TrimString(m_tagInfo.sAlbumName); TrimString(m_tagInfo.sArtistName); TrimString(m_tagInfo.sSongName); SetDlgItemTextA(hDlg, IDC_ARTISTNAME, m_tagInfo.sArtistName); SetDlgItemTextA(hDlg, IDC_ALBUMNAME, m_tagInfo.sAlbumName); SetDlgItemTextA(hDlg, IDC_SONGNAME, m_tagInfo.sSongName); if (strlen(m_tagInfo.sArtistName) > 0) bArtist = true; if (strlen(m_tagInfo.sAlbumName) > 0) bAlbum = true; if (strlen(m_tagInfo.sSongName) > 0) bSong = true; } if (!bArtist || !bAlbum || !bSong) UpdateByTagIDV2(hDlg, hFile, bArtist, bAlbum, bSong); CloseHandle(hFile); } }
void CLyricsDlg::UpdateByFileName(HWND hDlg, bool bArtist, bool bAlbum, bool bSong) { //we take the info from winamp //i.e. //736. Kataklysm - Taking the World By Storm - Winamp //until first dot and a ' ' is irrelevant //the last ' - Winamp' is irrelevant //then it follows: Artist - Song / Artist - Album - Song. we count how many '-' there are. string sText; int len = GetWindowTextLengthA(genDll.m_hWinamp); char* text = new char[len+1]; GetWindowTextA(genDll.m_hWinamp, text, len+1); sText = text; delete[] text; //removing irrelevant text int x = sText.find('.', 0); sText.erase(0, x + 2); x = sText.rfind('-'); sText.erase(x-1, sText.length()-1); //now result is in the format "xxxx - xxxx - xxx" or in the format "xxxx - xxxx" //we count the '-'s: int nCount = 0; int xs[3]; int i = 0; for (int i = 0; i < sText.length(); i++) { if (sText[i] == '-') { if (nCount > 2) break; xs[nCount] = i; nCount++; } } xs[nCount] = sText.length(); //we have i '-'s. now we get each string and tream them. string strs[3];int j = 0; for (int i = 0; i <= nCount; i++) { if (nCount == 0) break; strs[i] = sText.substr(j, xs[i] - j); j = xs[i]+1; } for (j = 0; j <= nCount; j++) { //ltrim string i for (i = 0; i < strs[j].length(); i++) { if (strs[j][i] ==' ') strs[j].erase(i, 1); else break; } //rtrim for (i = strs[j].length() - 1; i >=0; i--) { if (strs[j][i] ==' ') strs[j].erase(i, 1); else break; } } switch (nCount) { case 0: //no '-' found => all sText is SongName SetDlgItemTextA(hDlg, IDC_SONGNAME, sText.data()); break; case 1: //one '-' found => two substrings, 1 and 2, Artist and Song SetDlgItemTextA(hDlg, IDC_ARTISTNAME, strs[0].data()); SetDlgItemTextA(hDlg, IDC_SONGNAME, strs[1].data()); break; case 2: //three '-' found => three substrings, 1 and 2 and 3, artist and album and song SetDlgItemTextA(hDlg, IDC_ARTISTNAME, strs[0].data()); SetDlgItemTextA(hDlg, IDC_ALBUMNAME, strs[1].data()); SetDlgItemTextA(hDlg, IDC_SONGNAME, strs[2].data()); break; } }
void CLyricsDlg::OnOk(HWND hDlg) { CLyricsDlg* pThis = (CLyricsDlg*)GetWindowLongPtrA(hDlg, GWL_USERDATA); //we must check that all seconds were written correctly deque<CListSide::LINE>::iterator I, J; bool bWrong = false; for (I = pThis->m_List.m_Table.m_Lines.begin(); I != pThis->m_List.m_Table.m_Lines.end(); I++) { //must not be the last if (I->nIndex != pThis->m_List.m_Table.m_Lines.back().nIndex) { J = I + 1; char str[7]; GetWindowTextA(I->edSecond.m_hWnd, str, 7); string sec = str; int nrSec = atoi(sec.substr(0, 1).c_str()); nrSec *= 60; int valI = nrSec; nrSec = atoi(sec.substr(2, 2).c_str()); valI += nrSec; GetWindowTextA(J->edSecond.m_hWnd, str, 7); sec = str; nrSec = atoi(sec.substr(0, 1).c_str()); nrSec *= 60; int valJ = nrSec; nrSec = atoi(sec.substr(2, 2).c_str()); valJ += nrSec; if (valI >= valJ) { bWrong = true; break; } } } bool bWrong2 = true; for (I = pThis->m_List.m_Table.m_Lines.begin(); I != pThis->m_List.m_Table.m_Lines.end(); I++) { //must not be the last int len = GetWindowTextLength(I->edText.m_hWnd); if (len) { bWrong2 = false; break; } } if (bWrong2) bWrong = true; if (bWrong) { MessageBoxW(hDlg, L"Toate secundele trebuiesc setate în ordine crescătoare, te rog setează o valoare corectă", L"Repetiție", MB_ICONEXCLAMATION); //focus & selection SetFocus(J->edSecond.m_hWnd); SendMessage(J->edSecond.m_hWnd, EM_SETSEL, 0, 5); //scroll RECT rect; GetWindowRect(J->edSecond.m_hWnd, &rect); POINT pt = {rect.left, rect.top}; ScreenToClient(GetParent(J->edSecond.m_hWnd), &pt); pThis->m_List.m_Table.ScrollTo(pt.y); return; } HANDLE hFile = OpenLyricsFile(hDlg); if (hFile == INVALID_HANDLE_VALUE) return; DWORD dwWritten; for (I = pThis->m_List.m_Table.m_Lines.begin(); I != pThis->m_List.m_Table.m_Lines.end(); I++) { GenListCtrl::VERSE verse; char* str = new char[7]; GetWindowTextA(I->edSecond.m_hWnd, str, 7); //str e de forma mm:ss string sec = str; int nrSec = atoi(sec.substr(0, 1).c_str()); nrSec *= 60; verse.nrSec = nrSec; nrSec = atoi(sec.substr(2, 2).c_str()); verse.nrSec += nrSec; WriteFile(hFile, &verse.nrSec, sizeof(WORD), &dwWritten, 0); delete[] str; byte len = (byte)GetWindowTextLengthA(I->edText.m_hWnd); len++; str = new char[len]; GetWindowTextA(I->edText.m_hWnd, str, len); WriteFile(hFile, &len, 1, &dwWritten, 0); WriteFile(hFile, str, len, &dwWritten, 0); delete[] str; } CloseHandle(hFile); if (genDll.m_sSavingSong == genDll.m_sCurrentSong) SendMessage(genDll.m_hWinamp, WM_COMMAND, IDC_WINAMP_STOP, 0); //we now rewrite the specified .mp3 file hFile = CreateFile(genDll.m_sSavingSong.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hFile == INVALID_HANDLE_VALUE) { DWORD dwError = GetLastError(); char str[30]; sprintf_s(str, 30, "Error 0x%x", dwError); MessageBoxA(genDll.m_hWinamp, str, "Error!", MB_ICONERROR); #ifdef _DEBUG DebugBreak(); #endif EndDialog(hDlg, IDCANCEL); return; } //now, we search for ID3v1 SetFilePointer(hFile, -128, 0, FILE_END); DWORD dwRead; ReadFile(hFile, &m_tagInfo, 128, &dwRead, 0); if (m_tagInfo.cT == 'T' && m_tagInfo.cA == 'A' && m_tagInfo.cG == 'G') { //it means the file already has an ID3v1. ensure that we read all (should always happen) if (dwRead != 128) { DWORD dwError = GetLastError(); char str[30]; sprintf_s(str, 30, "Error 0x%x", dwError); MessageBoxA(hDlg, str, "Error!", MB_ICONERROR); #ifdef _DEBUG DebugBreak(); #endif CloseHandle(hFile); EndDialog(hDlg, IDCANCEL); return; } //reposition again and write the new structure: SetFilePointer(hFile, -128, 0, FILE_END); } //else reposition to the end of file: else { memset(&m_tagInfo, 0, sizeof(m_tagInfo)); m_tagInfo.cT = 'T'; m_tagInfo.cA = 'A'; m_tagInfo.cG = 'G'; m_tagInfo.dGenre = 255; LARGE_INTEGER liSize; GetFileSizeEx(hFile, &liSize); SetFilePointer(hFile, 128, 0, FILE_END); if (false == SetEndOfFile(hFile)) { DWORD dwError = GetLastError(); int x = 0; x++; } GetFileSizeEx(hFile, &liSize); SetFilePointer(hFile, -128, 0, FILE_END); } GetDlgItemTextA(hDlg, IDC_ARTISTNAME, m_tagInfo.sArtistName, 30); GetDlgItemTextA(hDlg, IDC_ALBUMNAME, m_tagInfo.sAlbumName, 30); GetDlgItemTextA(hDlg, IDC_SONGNAME, m_tagInfo.sSongName, 30); if (false == WriteFile(hFile, &m_tagInfo, 128, &dwRead, 0)) { DWORD dwError = GetLastError(); char str[30]; sprintf_s(str, "Error 0x%x", dwError); MessageBoxA(hDlg, str, "Error!", MB_ICONERROR); #ifdef _DEBUG DebugBreak(); #endif CloseHandle(hFile); EndDialog(hDlg, IDCANCEL); return; } CloseHandle(hFile); //and finally, we add this lyrics info in the list. LYRICSINFO lyrinfo; lyrinfo.sAlbum = m_tagInfo.sAlbumName; lyrinfo.sArtist = m_tagInfo.sArtistName; lyrinfo.sSong = m_tagInfo.sSongName; lyrinfo.wsFileName = genDll.m_sSavingSong; genDll.m_LyricsFiles.push_back(lyrinfo); EndDialog(hDlg, IDOK); }
INT_PTR CALLBACK DlgProcContainerOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { TContainerData *pContainer = 0; HWND hwndTree = GetDlgItem(hwndDlg, IDC_SECTIONTREE); pContainer = (TContainerData *) GetWindowLongPtr(hwndDlg, GWLP_USERDATA); switch (msg) { case WM_INITDIALOG: { wchar_t szNewTitle[128]; TContainerData *pContainer = 0; int i, j; TVINSERTSTRUCT tvis = {0}; HTREEITEM hItem; int nr_layouts = 0; const TSideBarLayout* sblayouts = CSideBar::getLayouts(nr_layouts); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR) lParam); pContainer = (TContainerData *) lParam; pContainer->hWndOptions = hwndDlg; TranslateDialogDefault(hwndDlg); SetWindowText(hwndDlg, TranslateT("Container options")); mir_sntprintf(szNewTitle, SIZEOF(szNewTitle), TranslateT("Configure container options for\n%s"), !_tcscmp(pContainer->szName, _T("default")) ? TranslateT("Default container") : pContainer->szName); SetDlgItemText(hwndDlg, IDC_HEADERBAR, szNewTitle); Utils::enableDlgControl(hwndDlg, IDC_O_HIDETITLE, CSkin::m_frameSkins ? FALSE : TRUE); CheckDlgButton(hwndDlg, IDC_CNTPRIVATE, pContainer->settings->fPrivate ? BST_CHECKED : BST_UNCHECKED); SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Tabs at the top")); SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Tabs at the bottom")); SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Switch bar on the left side")); SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Switch bar on the right side")); SendDlgItemMessage(hwndDlg, IDC_AVATARMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Globally on")); SendDlgItemMessage(hwndDlg, IDC_AVATARMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("On, if present")); SendDlgItemMessage(hwndDlg, IDC_AVATARMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Globally OFF")); SendDlgItemMessage(hwndDlg, IDC_AVATARMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("On, if present, always in bottom display")); SendDlgItemMessage(hwndDlg, IDC_OWNAVATARMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("On, if present")); SendDlgItemMessage(hwndDlg, IDC_OWNAVATARMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Don't show them")); for (i=0; i < nr_layouts; i++) SendDlgItemMessage(hwndDlg, IDC_SBARLAYOUT, CB_INSERTSTRING, -1, (LPARAM)TranslateTS(sblayouts[i].szName)); /* bits 24 - 31 of dwFlagsEx hold the side bar layout id */ SendDlgItemMessage(hwndDlg, IDC_SBARLAYOUT, CB_SETCURSEL, (WPARAM)((pContainer->settings->dwFlagsEx & 0xff000000) >> 24), 0); SendMessage(hwndDlg, DM_SC_INITDIALOG, 0, (LPARAM)pContainer->settings); SendDlgItemMessage(hwndDlg, IDC_TITLEFORMAT, EM_LIMITTEXT, TITLE_FORMATLEN - 1, 0); SetDlgItemText(hwndDlg, IDC_TITLEFORMAT, pContainer->settings->szTitleFormat); SetDlgItemText(hwndDlg, IDC_THEME, pContainer->szRelThemeFile); for (i=0; i < NR_O_PAGES; i++) { tvis.hParent = NULL; tvis.hInsertAfter = TVI_LAST; tvis.item.mask = TVIF_TEXT | TVIF_PARAM; tvis.item.pszText = TranslateTS(o_pages[i].szTitle); tvis.item.lParam = i; hItem = TreeView_InsertItem(hwndTree, &tvis); if (i == 0) SendMessage(hwndTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hItem); for (j = 0; j < NR_O_OPTIONSPERPAGE && o_pages[i].uIds[j] != 0; j++) Utils::showDlgControl(hwndDlg, o_pages[i].uIds[j], SW_HIDE); ShowPage(hwndDlg, i, FALSE); } SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadSkinnedIcon(SKINICON_EVENT_MESSAGE)); SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadSkinnedIconBig(SKINICON_EVENT_MESSAGE)); ShowPage(hwndDlg, 0, TRUE); SetFocus(hwndTree); Utils::enableDlgControl(hwndDlg, IDC_APPLY, FALSE); HFONT hFont = (HFONT)SendDlgItemMessage(hwndDlg, IDC_DESC, WM_GETFONT, 0, 0); LOGFONT lf = {0}; GetObject(hFont, sizeof(lf), &lf); lf.lfHeight = (int)(lf.lfHeight * 1.2); hFont = CreateFontIndirect(&lf); SendDlgItemMessage(hwndDlg, IDC_TITLEBOX, WM_SETFONT, (WPARAM)hFont, TRUE); if (pContainer->isCloned && pContainer->hContactFrom != 0) { Utils::showDlgControl(hwndDlg, IDC_CNTPRIVATE, SW_HIDE); Utils::showDlgControl(hwndDlg, IDC_O_CNTPRIVATE, SW_HIDE); } return FALSE; } case WM_CTLCOLOREDIT: case WM_CTLCOLORSTATIC: { HWND hwndChild = (HWND)lParam; UINT id = GetDlgCtrlID(hwndChild); if (hwndChild == GetDlgItem(hwndDlg, IDC_TITLEBOX)) { ::SetTextColor((HDC)wParam, RGB(60, 60, 150)); } else if (hwndChild == GetDlgItem(hwndDlg, IDC_DESC)) ::SetTextColor((HDC)wParam, RGB(160, 50, 50)); if (id == IDC_TSLABEL_REOPENWARN) break; SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW)); return (INT_PTR)GetSysColorBrush(COLOR_WINDOW); } case WM_NOTIFY: if (wParam == IDC_SECTIONTREE && ((LPNMHDR)lParam)->code == TVN_SELCHANGED) { NMTREEVIEW *pmtv = (NMTREEVIEW *)lParam; ShowPage(hwndDlg, pmtv->itemOld.lParam, 0); ShowPage(hwndDlg, pmtv->itemNew.lParam, 1); } break; case WM_HSCROLL: if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_TRANSPARENCY_ACTIVE) || (HWND)lParam == GetDlgItem(hwndDlg, IDC_TRANSPARENCY_INACTIVE)) Utils::enableDlgControl(hwndDlg, IDC_APPLY, TRUE); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_CNTPRIVATE: { if (IsDlgButtonChecked(hwndDlg, IDC_CNTPRIVATE)) { Utils::ReadPrivateContainerSettings(pContainer, true); pContainer->settings->fPrivate = true; } else { if (pContainer->settings != &PluginConfig.globalContainerSettings) { char szCname[40]; mir_snprintf(szCname, 40, "%s%d_Blob", CNT_BASEKEYNAME, pContainer->iContainerIndex); pContainer->settings->fPrivate = false; db_set_blob(0, SRMSGMOD_T, szCname, pContainer->settings, sizeof(TContainerSettings)); mir_free(pContainer->settings); } pContainer->settings = &PluginConfig.globalContainerSettings; pContainer->settings->fPrivate = false; } SendMessage(hwndDlg, DM_SC_INITDIALOG, 0, (LPARAM)pContainer->settings); goto do_apply; } case IDC_TRANSPARENCY: { int isTrans = IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENCY); Utils::enableDlgControl(hwndDlg, IDC_TRANSPARENCY_ACTIVE, isTrans ? TRUE : FALSE); Utils::enableDlgControl(hwndDlg, IDC_TRANSPARENCY_INACTIVE, isTrans ? TRUE : FALSE); goto do_apply; } case IDC_SECTIONTREE: case IDC_DESC: return 0; case IDC_SAVESIZEASGLOBAL: { WINDOWPLACEMENT wp = {0}; wp.length = sizeof(wp); if (GetWindowPlacement(pContainer->hwnd, &wp)) { db_set_dw(0, SRMSGMOD_T, "splitx", wp.rcNormalPosition.left); db_set_dw(0, SRMSGMOD_T, "splity", wp.rcNormalPosition.top); db_set_dw(0, SRMSGMOD_T, "splitwidth", wp.rcNormalPosition.right - wp.rcNormalPosition.left); db_set_dw(0, SRMSGMOD_T, "splitheight", wp.rcNormalPosition.bottom - wp.rcNormalPosition.top); } break; } case IDC_O_ENABLESOUNDS: SendMessage(hwndDlg, DM_SC_CONFIG, 0, 0); break; case IDC_TITLEFORMAT: if (HIWORD(wParam) != EN_CHANGE || (HWND) lParam != GetFocus()) return TRUE; goto do_apply; case IDC_SELECTTHEME: { const wchar_t *szFileName = GetThemeFileName(0); if (PathFileExists(szFileName)) { SetDlgItemText(hwndDlg, IDC_THEME, szFileName); goto do_apply; } break; } case IDC_O_HELP_TITLEFORMAT: CallService(MS_UTILS_OPENURL, OUF_NEWWINDOW|OUF_TCHAR, (LPARAM)_T("http://miranda.or.at/TabSRMM/TitleBarFormatting")); break; case IDOK: case IDC_APPLY: { SendMessage(hwndDlg, DM_SC_BUILDLIST, 0, (LPARAM)pContainer->settings); pContainer->settings->dwTransparency = MAKELONG((WORD)SendDlgItemMessage(hwndDlg, IDC_TRANSPARENCY_ACTIVE, TBM_GETPOS, 0, 0), (WORD)SendDlgItemMessage(hwndDlg, IDC_TRANSPARENCY_INACTIVE, TBM_GETPOS, 0, 0)); pContainer->settings->avatarMode = (WORD)SendDlgItemMessage(hwndDlg, IDC_AVATARMODE, CB_GETCURSEL, 0, 0); pContainer->settings->ownAvatarMode = (WORD)SendDlgItemMessage(hwndDlg, IDC_OWNAVATARMODE, CB_GETCURSEL, 0, 0); GetDlgItemText(hwndDlg, IDC_TITLEFORMAT, pContainer->settings->szTitleFormat, TITLE_FORMATLEN); pContainer->settings->szTitleFormat[TITLE_FORMATLEN - 1] = 0; pContainer->szRelThemeFile[0] = pContainer->szAbsThemeFile[0] = 0; if (GetWindowTextLengthA(GetDlgItem(hwndDlg, IDC_THEME)) > 0) { wchar_t szFinalThemeFile[MAX_PATH], szFilename[MAX_PATH]; GetDlgItemText(hwndDlg, IDC_THEME, szFilename, MAX_PATH); szFilename[MAX_PATH - 1] = 0; M.pathToAbsolute(szFilename, szFinalThemeFile); if (_tcscmp(szFilename, pContainer->szRelThemeFile)) pContainer->fPrivateThemeChanged = TRUE; if (PathFileExists(szFinalThemeFile)) mir_sntprintf(pContainer->szRelThemeFile, MAX_PATH, _T("%s"), szFilename); else pContainer->szRelThemeFile[0] = 0; } else { pContainer->szRelThemeFile[0] = 0; pContainer->fPrivateThemeChanged = TRUE; } Utils::SettingsToContainer(pContainer); if (!IsDlgButtonChecked(hwndDlg, IDC_CNTPRIVATE)) { ReloadGlobalContainerSettings(true); ::db_set_blob(0, SRMSGMOD_T, CNT_KEYNAME, &PluginConfig.globalContainerSettings, sizeof(TContainerSettings)); } else { char *szSetting = "CNTW_"; Utils::SaveContainerSettings(pContainer, szSetting); } SendMessage(pContainer->hwnd, DM_CONFIGURECONTAINER, 0, 0); BroadCastContainer(pContainer, DM_SETINFOPANEL, 0, 0); ShowWindow(pContainer->hwnd, SW_HIDE); { RECT rc; GetWindowRect(pContainer->hwnd, &rc); SetWindowPos(pContainer->hwnd, 0, rc.left, rc.top, (rc.right - rc.left) - 1, (rc.bottom - rc.top) - 1, SWP_NOZORDER | SWP_DRAWFRAME | SWP_FRAMECHANGED); SetWindowPos(pContainer->hwnd, 0, rc.left, rc.top, (rc.right - rc.left), (rc.bottom - rc.top), SWP_NOZORDER | SWP_DRAWFRAME | SWP_SHOWWINDOW); } if (LOWORD(wParam) == IDOK) DestroyWindow(hwndDlg); else Utils::enableDlgControl(hwndDlg, IDC_APPLY, FALSE); break; } case IDCANCEL: DestroyWindow(hwndDlg); return TRUE; default: do_apply: Utils::enableDlgControl(hwndDlg, IDC_APPLY, TRUE); break; } break; case DM_SC_INITDIALOG: { TContainerSettings* cs = (TContainerSettings *)lParam; DWORD dwFlags = cs->dwFlags; DWORD dwTransparency = cs->dwTransparency; DWORD dwFlagsEx = cs->dwFlagsEx; int isTrans; BOOL fAllowTrans = FALSE; if (PluginConfig.m_WinVerMajor >= 6) fAllowTrans = TRUE; else fAllowTrans = (!CSkin::m_skinEnabled); MY_CheckDlgButton(hwndDlg, IDC_O_HIDETITLE, dwFlags & CNT_NOTITLE); MY_CheckDlgButton(hwndDlg, IDC_O_DONTREPORT, dwFlags & CNT_DONTREPORT); MY_CheckDlgButton(hwndDlg, IDC_O_NOTABS, dwFlags & CNT_HIDETABS); MY_CheckDlgButton(hwndDlg, IDC_O_STICKY, dwFlags & CNT_STICKY); MY_CheckDlgButton(hwndDlg, IDC_O_FLASHNEVER, dwFlags & CNT_NOFLASH); MY_CheckDlgButton(hwndDlg, IDC_O_FLASHALWAYS, dwFlags & CNT_FLASHALWAYS); MY_CheckDlgButton(hwndDlg, IDC_O_FLASHDEFAULT, !((dwFlags & CNT_NOFLASH) || (dwFlags & CNT_FLASHALWAYS))); MY_CheckDlgButton(hwndDlg, IDC_TRANSPARENCY, dwFlags & CNT_TRANSPARENCY); MY_CheckDlgButton(hwndDlg, IDC_DONTREPORTUNFOCUSED2, dwFlags & CNT_DONTREPORTUNFOCUSED); MY_CheckDlgButton(hwndDlg, IDC_DONTREPORTFOCUSED2, dwFlags & CNT_DONTREPORTFOCUSED); MY_CheckDlgButton(hwndDlg, IDC_ALWAYSPOPUPSINACTIVE, dwFlags & CNT_ALWAYSREPORTINACTIVE); MY_CheckDlgButton(hwndDlg, IDC_CNTNOSTATUSBAR, dwFlags & CNT_NOSTATUSBAR); MY_CheckDlgButton(hwndDlg, IDC_HIDEMENUBAR, dwFlags & CNT_NOMENUBAR); MY_CheckDlgButton(hwndDlg, IDC_HIDETOOLBAR, dwFlags & CNT_HIDETOOLBAR); MY_CheckDlgButton(hwndDlg, IDC_BOTTOMTOOLBAR, dwFlags & CNT_BOTTOMTOOLBAR); MY_CheckDlgButton(hwndDlg, IDC_UIDSTATUSBAR, dwFlags & CNT_UINSTATUSBAR); MY_CheckDlgButton(hwndDlg, IDC_VERTICALMAX, dwFlags & CNT_VERTICALMAX); #if defined(__FEAT_EXP_AUTOSPLITTER) MY_CheckDlgButton(hwndDlg, IDC_AUTOSPLITTER, dwFlags & CNT_AUTOSPLITTER); #endif MY_CheckDlgButton(hwndDlg, IDC_AVATARSONTASKBAR, dwFlags & CNT_AVATARSONTASKBAR); MY_CheckDlgButton(hwndDlg, IDC_INFOPANEL, dwFlags & CNT_INFOPANEL); MY_CheckDlgButton(hwndDlg, IDC_USEGLOBALSIZE, dwFlags & CNT_GLOBALSIZE); MY_CheckDlgButton(hwndDlg, IDC_FLASHICON, dwFlagsEx & TCF_FLASHICON); MY_CheckDlgButton(hwndDlg, IDC_FLASHLABEL, dwFlagsEx & TCF_FLASHLABEL); MY_CheckDlgButton(hwndDlg, IDC_CLOSEBUTTONONTABS, dwFlagsEx & TCF_CLOSEBUTTON); MY_CheckDlgButton(hwndDlg, IDC_SINGLEROWTAB, dwFlagsEx & TCF_SINGLEROWTABCONTROL); MY_CheckDlgButton(hwndDlg, IDC_BUTTONTABS, dwFlagsEx & TCF_FLAT); MY_CheckDlgButton(hwndDlg, IDC_O_ENABLESOUNDS, !(dwFlags & CNT_NOSOUND)); MY_CheckDlgButton(hwndDlg, IDC_O_SOUNDSMINIMIZED, dwFlagsEx & CNT_EX_SOUNDS_MINIMIZED); MY_CheckDlgButton(hwndDlg, IDC_O_SOUNDSUNFOCUSED, dwFlagsEx & CNT_EX_SOUNDS_UNFOCUSED); MY_CheckDlgButton(hwndDlg, IDC_O_SOUNDSINACTIVE, dwFlagsEx & CNT_EX_SOUNDS_INACTIVETABS); MY_CheckDlgButton(hwndDlg, IDC_O_SOUNDSFOCUSED, dwFlagsEx & CNT_EX_SOUNDS_FOCUSED); SendMessage(hwndDlg, DM_SC_CONFIG, 0, 0); if (!(dwFlagsEx & (TCF_SBARLEFT | TCF_SBARRIGHT))) SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_SETCURSEL, dwFlags & CNT_TABSBOTTOM ? 1 : 0, 0); else SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_SETCURSEL, dwFlagsEx & TCF_SBARLEFT ? 2 : 3, 0); if (LOBYTE(LOWORD(GetVersion())) >= 5 && fAllowTrans) CheckDlgButton(hwndDlg, IDC_TRANSPARENCY, dwFlags & CNT_TRANSPARENCY); else CheckDlgButton(hwndDlg, IDC_TRANSPARENCY, FALSE); Utils::enableDlgControl(hwndDlg, IDC_TRANSPARENCY, PluginConfig.m_WinVerMajor >= 5 && fAllowTrans ? TRUE : FALSE); isTrans = IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENCY); Utils::enableDlgControl(hwndDlg, IDC_TRANSPARENCY_ACTIVE, isTrans ? TRUE : FALSE); Utils::enableDlgControl(hwndDlg, IDC_TRANSPARENCY_INACTIVE, isTrans ? TRUE : FALSE); SendDlgItemMessage(hwndDlg, IDC_TRANSPARENCY_ACTIVE, TBM_SETRANGE, 0, (LPARAM)MAKELONG(50, 255)); SendDlgItemMessage(hwndDlg, IDC_TRANSPARENCY_INACTIVE, TBM_SETRANGE, 0, (LPARAM)MAKELONG(50, 255)); SendDlgItemMessage(hwndDlg, IDC_TRANSPARENCY_ACTIVE, TBM_SETPOS, TRUE, (LPARAM)LOWORD(dwTransparency)); SendDlgItemMessage(hwndDlg, IDC_TRANSPARENCY_INACTIVE, TBM_SETPOS, TRUE, (LPARAM)HIWORD(dwTransparency)); Utils::enableDlgControl(hwndDlg, IDC_O_DONTREPORT, nen_options.bWindowCheck == 0); Utils::enableDlgControl(hwndDlg, IDC_DONTREPORTUNFOCUSED2, nen_options.bWindowCheck == 0); Utils::enableDlgControl(hwndDlg, IDC_DONTREPORTFOCUSED2, nen_options.bWindowCheck == 0); Utils::enableDlgControl(hwndDlg, IDC_ALWAYSPOPUPSINACTIVE, nen_options.bWindowCheck == 0); SendDlgItemMessage(hwndDlg, IDC_AVATARMODE, CB_SETCURSEL, (WPARAM)cs->avatarMode, 0); SendDlgItemMessage(hwndDlg, IDC_OWNAVATARMODE, CB_SETCURSEL, (WPARAM)cs->ownAvatarMode, 0); Utils::showDlgControl(hwndDlg, IDC_O_EXPLAINGLOBALNOTIFY, nen_options.bWindowCheck ? SW_SHOW : SW_HIDE); SendDlgItemMessage(hwndDlg, IDC_AUTOCLOSETABSPIN, UDM_SETRANGE, 0, MAKELONG(1000, 0)); SendDlgItemMessage(hwndDlg, IDC_AUTOCLOSETABSPIN, UDM_SETPOS, 0, (LPARAM)cs->autoCloseSeconds); break; } case DM_SC_CONFIG: { LRESULT enable = (IsDlgButtonChecked(hwndDlg, IDC_O_ENABLESOUNDS) ? BST_CHECKED : BST_UNCHECKED); Utils::enableDlgControl(hwndDlg, IDC_O_SOUNDSINACTIVE, enable); Utils::enableDlgControl(hwndDlg, IDC_O_SOUNDSUNFOCUSED, enable); Utils::enableDlgControl(hwndDlg, IDC_O_SOUNDSMINIMIZED, enable); Utils::enableDlgControl(hwndDlg, IDC_O_SOUNDSFOCUSED, enable); return 0; } case DM_SC_BUILDLIST: { DWORD dwNewFlags = 0, dwNewFlagsEx = 0; TContainerSettings* cs = (TContainerSettings *)lParam; dwNewFlags = (IsDlgButtonChecked(hwndDlg, IDC_O_HIDETITLE) ? CNT_NOTITLE : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_DONTREPORT) ? CNT_DONTREPORT : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_NOTABS) ? CNT_HIDETABS : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_STICKY) ? CNT_STICKY : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_FLASHALWAYS) ? CNT_FLASHALWAYS : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_FLASHNEVER) ? CNT_NOFLASH : 0) | (IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENCY) ? CNT_TRANSPARENCY : 0) | (IsDlgButtonChecked(hwndDlg, IDC_DONTREPORTUNFOCUSED2) ? CNT_DONTREPORTUNFOCUSED : 0) | (IsDlgButtonChecked(hwndDlg, IDC_DONTREPORTFOCUSED2) ? CNT_DONTREPORTFOCUSED : 0) | (IsDlgButtonChecked(hwndDlg, IDC_ALWAYSPOPUPSINACTIVE) ? CNT_ALWAYSREPORTINACTIVE : 0) | (IsDlgButtonChecked(hwndDlg, IDC_CNTNOSTATUSBAR) ? CNT_NOSTATUSBAR : 0) | (IsDlgButtonChecked(hwndDlg, IDC_HIDEMENUBAR) ? CNT_NOMENUBAR : 0) | (IsDlgButtonChecked(hwndDlg, IDC_HIDETOOLBAR) ? CNT_HIDETOOLBAR : 0) | (IsDlgButtonChecked(hwndDlg, IDC_BOTTOMTOOLBAR) ? CNT_BOTTOMTOOLBAR : 0) | (IsDlgButtonChecked(hwndDlg, IDC_UIDSTATUSBAR) ? CNT_UINSTATUSBAR : 0) | (IsDlgButtonChecked(hwndDlg, IDC_USEGLOBALSIZE) ? CNT_GLOBALSIZE : 0) | (IsDlgButtonChecked(hwndDlg, IDC_INFOPANEL) ? CNT_INFOPANEL : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_ENABLESOUNDS) ? 0 : CNT_NOSOUND) | (IsDlgButtonChecked(hwndDlg, IDC_AVATARSONTASKBAR) ? CNT_AVATARSONTASKBAR : 0) | (IsDlgButtonChecked(hwndDlg, IDC_VERTICALMAX) ? CNT_VERTICALMAX : 0) | #if defined(__FEAT_EXP_AUTOSPLITTER) (IsDlgButtonChecked(hwndDlg, IDC_AUTOSPLITTER) ? CNT_AUTOSPLITTER : 0) | #endif (CNT_NEWCONTAINERFLAGS); LRESULT iTabMode = SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_GETCURSEL, 0, 0); LRESULT iTabLayout = SendDlgItemMessage(hwndDlg, IDC_SBARLAYOUT, CB_GETCURSEL, 0, 0); dwNewFlagsEx = 0; if (iTabMode < 2) dwNewFlags = ((iTabMode == 1) ? (dwNewFlags | CNT_TABSBOTTOM) : (dwNewFlags & ~CNT_TABSBOTTOM)); else { dwNewFlags &= ~CNT_TABSBOTTOM; dwNewFlagsEx = iTabMode == 2 ? TCF_SBARLEFT : TCF_SBARRIGHT; } dwNewFlagsEx |= ((IsDlgButtonChecked(hwndDlg, IDC_FLASHICON) ? TCF_FLASHICON : 0) | (IsDlgButtonChecked(hwndDlg, IDC_FLASHLABEL) ? TCF_FLASHLABEL : 0) | (IsDlgButtonChecked(hwndDlg, IDC_BUTTONTABS) ? TCF_FLAT : 0) | (IsDlgButtonChecked(hwndDlg, IDC_CLOSEBUTTONONTABS) ? TCF_CLOSEBUTTON : 0) | (IsDlgButtonChecked(hwndDlg, IDC_SINGLEROWTAB) ? TCF_SINGLEROWTABCONTROL : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_SOUNDSMINIMIZED) ? CNT_EX_SOUNDS_MINIMIZED : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_SOUNDSUNFOCUSED) ? CNT_EX_SOUNDS_UNFOCUSED : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_SOUNDSFOCUSED) ? CNT_EX_SOUNDS_FOCUSED : 0) | (IsDlgButtonChecked(hwndDlg, IDC_O_SOUNDSINACTIVE) ? CNT_EX_SOUNDS_INACTIVETABS : 0) ); /* bits 24 - 31 of dwFlagsEx hold the sidebar layout id */ dwNewFlagsEx |= ((int)((iTabLayout << 24) & 0xff000000)); if (IsDlgButtonChecked(hwndDlg, IDC_O_FLASHDEFAULT)) dwNewFlags &= ~(CNT_FLASHALWAYS | CNT_NOFLASH); cs->dwFlags = dwNewFlags; cs->dwFlagsEx = dwNewFlagsEx; cs->autoCloseSeconds = (WORD)SendDlgItemMessage(hwndDlg, IDC_AUTOCLOSETABSPIN, UDM_GETPOS, 0, 0); break; } case WM_DESTROY: { pContainer->hWndOptions = 0; SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); HFONT hFont = (HFONT)SendDlgItemMessage(hwndDlg, IDC_TITLEBOX, WM_GETFONT, 0, 0); DeleteObject(hFont); break; } } return FALSE; }
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 }; static GLuint PixelFormat; static HWND hEdit; static HFONT hFont; static HINSTANCE hRtLib; static BOOL bEditVisible = TRUE; static HGLRC hRC; switch (msg) { case WM_CREATE: hRtLib = LoadLibrary(TEXT("RICHED32")); hFont = CreateFont(24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, TEXT("Consolas")); hEdit = CreateWindowEx(WS_EX_LAYERED, RICHEDIT_CLASS, 0, WS_VISIBLE | WS_POPUP | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_NOHIDESEL, 0, 0, 0, 0, hWnd, 0, ((LPCREATESTRUCT)lParam)->hInstance, 0); SendMessage(hEdit, EM_SETTEXTMODE, TM_PLAINTEXT, 0); SendMessage(hEdit, EM_LIMITTEXT, -1, 0); EditWndProc = (WNDPROC)SetWindowLong(hEdit, GWL_WNDPROC, (LONG)EditProc); SendMessage(hEdit, WM_SETFONT, (WPARAM)hFont, 0); if (!(hDC = GetDC(hWnd)) || !(PixelFormat = ChoosePixelFormat(hDC, &pfd)) || !SetPixelFormat(hDC, PixelFormat, &pfd) || !(hRC = wglCreateContext(hDC)) || !wglMakeCurrent(hDC, hRC) || glewInit() != GLEW_OK || !InitGL()) return -1; SetWindowText(hEdit, TEXT("#define pi 3.14159265358979\r\n") TEXT("uniform float time;\r\n") TEXT("void main()\r\n") TEXT("{\r\n") TEXT(" vec2 p = gl_FragCoord;\r\n") TEXT(" float c = 0.0;\r\n") TEXT(" for (float i = 0.0; i < 5.0; i++)\r\n") TEXT(" {\r\n") TEXT(" vec2 b = vec2(\r\n") TEXT(" sin(time + i * pi / 7) * 256 + 512,\r\n") TEXT(" cos(time + i * pi / 2) * 256 + 384\r\n") TEXT(" );\r\n") TEXT(" c += 32 / distance(p, b);\r\n") TEXT(" }\r\n") TEXT(" gl_FragColor = vec4(c*c / sin(time), c*c / 2, c*c, 1.0);\r\n") TEXT("}\r\n") ); PostMessage(hWnd, WM_CREATED, 0, 0); break; case WM_CREATED: SendMessage(hWnd, WM_COMMAND, MAKEWPARAM(0, EN_CHANGE), (long)hEdit); SendMessage(hEdit, EM_SETEVENTMASK, 0, (LPARAM)(SendMessage(hEdit, EM_GETEVENTMASK, 0, 0) | ENM_CHANGE)); SetFocus(hEdit); PostMessage(hEdit, WM_SETALPHA, SHOWEDITALPHA, 0); break; case WM_MOVE: { RECT rect; GetClientRect(hWnd, &rect); ClientToScreen(hWnd, (LPPOINT)&rect.left); ClientToScreen(hWnd, (LPPOINT)&rect.right); MoveWindow(hEdit, rect.left + 16, rect.top + 16, rect.right - rect.left - 32, rect.bottom - rect.top - 32, 1); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case 0: if (HIWORD(wParam) == EN_CHANGE) { const DWORD dwSize = GetWindowTextLengthA(hEdit); if (!dwSize) return 0; LPSTR lpszText = (LPSTR)GlobalAlloc(0, (dwSize + 1)*sizeof(CHAR)); if (!lpszText) return 0; GetWindowTextA(hEdit, lpszText, dwSize + 1); const GLuint newProgram = CreateProgram(vsrc, lpszText); if (newProgram) { if (program) glDeleteProgram(program); program = newProgram; SetWindowText(hWnd, TEXT("フラグメントシェーダ [コンパイル成功]")); } else { SetWindowText(hWnd, TEXT("フラグメントシェーダ [コンパイル失敗]")); } GlobalFree(lpszText); } break; case ID_EDITSHOW: ShowWindow(hEdit, IsWindowVisible(hEdit) ? SW_HIDE : SW_NORMAL); break; case ID_SELECTALL: if (IsWindowVisible(hEdit)) { SendMessage(hEdit, EM_SETSEL, 0, -1); SetFocus(hEdit); } break; } break; case WM_RBUTTONDOWN: case WM_LBUTTONDOWN: SendMessage(hWnd, WM_COMMAND, ID_EDITSHOW, 0); break; case WM_ACTIVATE: active = !HIWORD(wParam); break; case WM_DESTROY: DeleteObject(hFont); if (program) glDeleteProgram(program); if (vbo) glDeleteBuffers(1, &vbo); if (vao) glDeleteVertexArrays(1, &vao); if (hRC) { wglMakeCurrent(0, 0); wglDeleteContext(hRC); } if (hDC) ReleaseDC(hWnd, hDC); DestroyWindow(hEdit); FreeLibrary(hRtLib); PostQuitMessage(0); break; case WM_SYSCOMMAND: switch (wParam) { case SC_SCREENSAVE: case SC_MONITORPOWER: return 0; } default: return DefWindowProc(hWnd, msg, wParam, lParam); } return 0; }