BROWSEINFO brinfo;
brinfo.hwndOwner=0;
brinfo.pidlRoot=0;
brinfo.pszDisplayName="ok";
brinfo.lpszTitle="choose dir";
brinfo.ulFlags=BIF_RETURNONLYFSDIRS;
brinfo.lpfn=0;
brinfo.lParam=0;
SHBrowseForFolder(&brinfo);
Возникла загвоздка с вызовом стандартного диалога открытия папки
Подскажите кто-нибудь, как можно вызвать диалог открытия папки?
Смотри MSDN и поиск по форуму с этой функцией.
Код:
должно получиться. и не забудь подключить shlobj.h
А в MFC есть какой-нибудь класс, который за это отвечает, как например за открытие и сохранение используется класс CFileDialog?
Вот там есть примеры (на WinAPI): http://mrhx.narod.ru/soft/cpphlpr.exe
не понимаю зачем юзать какой-то класс, неужели 9 строчек это много.
В программе запускается поток, проводящий определённые вычисления. Как программно определить, что он запущен и при повторном нажатии на кнопку запуска сначала убивался действующий поток и запускался новый?
При создании новой нити запоминай возвращяемый тебе CreateThread хэндл этого потока. И потом если этот хэндл существует то можеш завершить поток спомощью TerminateThread и создать новый. Но все же лучше так не делать а использовать при необходимости завершения потока функции синхронизации типа эвентов мьютексов и т.д А в коде нити просто делаеш через определенный промежуток провеку состоянии этих объектов и если они находятся в сигнальном состоянии тогда завершаеш корректно поток. а в основной нити ждеш завершения текущего потока с помощью WaitForSingleObject и токо когда он возвратит успешный результат запускаеш новый поток.
ЗЫ А синхронизировать мне не нужно - поток не критичный и его немедленное завершение в принципе не должно дурно повлиять на основную нить!
Еще хочу уточнить оду вещь: у меня есть HWND контрола Progress Bar. Могу ли я Изменять Range и Position данного контрола, используя этот HWND?
конечно,если WINAPI то используй сообщения PBM_SETRANGE,PBM_SETPOS в любое время когда нужно
Код:
DWORD CALLBACK CopyProgressRoutine(
LARGE_INTEGER TotalFileSize,
LARGE_INTEGER TotalBytesTransferred,
LARGE_INTEGER StreamSize,
LARGE_INTEGER StreamBytesTransferred,
DWORD dwStreamNumber,
DWORD dwCallbackReason,
HANDLE hSourceFile,
HANDLE hDestinationFile,
LPVOID lpData)
{
HWND hwndMainWin;
HWND hwndProgrCtrl;
CString sTFS;
CString sTBT;
sTFS.Format(_T("%i"), TotalFileSize);
sTBT.Format(_T("%i"), TotalBytesTransferred);
short FileSize = atoi(sTFS);
short BytesTransferred = atoi(sTBT);
hwndMainWin = FindWindow(NULL, "IBBackup");
hwndProgrCtrl = GetDlgItem(hwndMainWin, IDC_COPY_PROGRESS);
SendMessage(hwndProgrCtrl, PBM_SETRANGE, 0, MAKELPARAM(0, (FileSize)));
SendMessage(hwndProgrCtrl, PBM_SETSTEP, (WPARAM) 1024, 0);
SendMessage(hwndProgrCtrl, PBM_SETPOS, (WPARAM) BytesTransferred, 0);
return PROGRESS_CONTINUE;
}
LARGE_INTEGER TotalFileSize,
LARGE_INTEGER TotalBytesTransferred,
LARGE_INTEGER StreamSize,
LARGE_INTEGER StreamBytesTransferred,
DWORD dwStreamNumber,
DWORD dwCallbackReason,
HANDLE hSourceFile,
HANDLE hDestinationFile,
LPVOID lpData)
{
HWND hwndMainWin;
HWND hwndProgrCtrl;
CString sTFS;
CString sTBT;
sTFS.Format(_T("%i"), TotalFileSize);
sTBT.Format(_T("%i"), TotalBytesTransferred);
short FileSize = atoi(sTFS);
short BytesTransferred = atoi(sTBT);
hwndMainWin = FindWindow(NULL, "IBBackup");
hwndProgrCtrl = GetDlgItem(hwndMainWin, IDC_COPY_PROGRESS);
SendMessage(hwndProgrCtrl, PBM_SETRANGE, 0, MAKELPARAM(0, (FileSize)));
SendMessage(hwndProgrCtrl, PBM_SETSTEP, (WPARAM) 1024, 0);
SendMessage(hwndProgrCtrl, PBM_SETPOS, (WPARAM) BytesTransferred, 0);
return PROGRESS_CONTINUE;
}
Что у меня неправильно?
к тому же если тебе известен идентификатор элемента управления, т.е. прогрессбара, то можно записать, например, так:
Код:
SendDlgItemMessage(hwndMainWin, IDC_COPY_PROGRESS, PBM_SETPOS, (WPARAM) 50,0)
ну или как тебе надо - у меня этот код для своего окна работает, т.е. позиция устанавливается.