PDA

View Full Version : نمایش و کنترل Dialog در C++ Native



r0ot$harp
دوشنبه 26 فروردین 1392, 15:44 عصر
سلام دوستان عزیز

من یه DLL دارم می نویسم. در اصل دارم Customize می کنم. به یه مشکلی خوردم. احتیاج دارم که از Dialog استفاده کنم. از طریق کد زیر Dialog رو نمایش می دم اما اصلا نمی دونم باید چگونه مدیریتش کنم؟؟؟ مثلا زمانی که روی Button OK کلیک شد چگونه Event رو اجرا کنم؟؟؟ در ضمن الان هر چی دکمه Exit بالای فرم رو می زنم بسته نمی شه. باید چی کار کنم.

HMODULE hModule = GetModuleHandle("Sample.dll");
HWND g_splash = CreateDialog( hModule, MAKEINTRESOURCE(IDD_DIALOG1), NULL, NULL);
RECT rcWnd;
GetWindowRect(g_splash,&rcWnd);
int X=(GetSystemMetrics(SM_CXSCREEN)-rcWnd.right+rcWnd.left)>>1,
Y=(GetSystemMetrics(SM_CYSCREEN)-rcWnd.bottom+rcWnd.top)>>1;
MoveWindow(g_splash,X,Y,rcWnd.right-rcWnd.left,rcWnd.bottom-rcWnd.top,FALSE);
ShowWindow(g_splash,SW_SHOW);
BOOL bRet;
MSG msg;
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
MessageBox(NULL, "GetMessage error with -1 returned?", "error",MB_ICONHAND);
break;
}
else if (!IsWindow(g_splash) || !IsDialogMessage(g_splash, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

از C++ Native استفاده می کنم. نه از CLR می تونم استفاده کنم نه از MFC

باتشکر احسان

r0ot$harp
دوشنبه 26 فروردین 1392, 22:23 عصر
دوستان من از این کد استفاده می کنم. کد درست هست. زمانی که روی دکمه OK کلیک می کنم Dialog بسته می شه. اما مشکلی که پیش میاد اینه که دیگه هرچی می زنم Dialog باز نمی شه.

کد صفحه Dialog:
// Emergency_Logon.cpp

#include "stdafx.h"
#include "Emergency_Logon.h"
#include "resource.h"


bool SetControlText(HWND hDlg, int id, const wchar_t* pText) {
HWND hwnd = GetDlgItem(hDlg, id);
if (!hwnd) return false;

return SetWindowText(hwnd, (LPCSTR)pText ? (LPCSTR)pText : "") ? true : false;
}

void CenterWindow(HWND hwnd) {
RECT rc;
if (!GetWindowRect(hwnd, &rc)) return;

const int width = rc.right - rc.left;
const int height = rc.bottom - rc.top;

MoveWindow(hwnd,
(GetSystemMetrics(SM_CXSCREEN) - width) / 2,
(GetSystemMetrics(SM_CYSCREEN) - height) / 2,
width, height, true);
}


Emergency_Logon::Emergency_Logon( )
{

_hwnd = CreateDialog(GetMyInstance(), MAKEINTRESOURCE(IDD_EMERGENCY_LOGON), 0, _dialogProc);
CenterWindow(_hwnd);
ShowWindow(_hwnd, SW_SHOW);

if (_hwnd) {
// if ( SetControlText(_hwnd, IDC_MESSAGE, message)) {
/* if (title) {
SetWindowText(_hwnd, title);
}*/
//}
}
}

Emergency_Logon::~Emergency_Logon() {

DestroyWindow(_hwnd);
MessageBox(NULL,"OK","Error",MB_ICONHAND);
}

INT_PTR CALLBACK Emergency_Logon::_dialogProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
switch (msg) {
case WM_COMMAND: {
switch (LOWORD(wp)) {
case IDC_BUTTON12:
EndDialog(hwnd, IDC_BUTTON12);
MessageBox(NULL,"OK1","Error",MB_ICONHAND);
break;
}
return TRUE;
}
}
return FALSE;
}

کد نمایش Dialog:
Emergency_Logon* emergency = new Emergency_Logon();

Ananas
دوشنبه 26 فروردین 1392, 23:52 عصر
سلام.
حاجی این نمونه رو ببین:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_KEYDOWN:
break;
case WM_MOUSEMOVE:
break;
case WM_COMMAND:
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

پیغام های مختلف ویندوز رو که لازم داری (MouseMove و MouseDown و KeyDown و ... که با WM_ شروع میشن) مینویسی تو switch بعد برای هر کدوم کدی رو که لازم داری مینویسی.

r0ot$harp
چهارشنبه 28 فروردین 1392, 09:33 صبح
دوست عزیز تشکر الان یه مشکلی دارم اونم اینکه زمانی که Dialog باز می شه تا وقتی بسته نشه به هیچ وجه اجازه کار به قسمت های دیگه رو نمی ده. وقتی Dialog رو می بندم این مشکل حل می شه و به راحتی تو فرم های دیگه مربوط به ویندوز می ره. باتشکر احسان

Ananas
چهارشنبه 28 فروردین 1392, 14:39 عصر
به نظرم اشکال کار تو قسمت ساخت پنجره هست که یک فلگ درست باید بهش بدی. از عباراتی که با WS_ (اگه اشتباه نکنم منظورش Window Style هست) شروع میشن باید انتخاب و ترکیب درست داشته باشید. مثل :
WS_POPUP | WS_EX_TOPMOST | WS_OVERLAPPEDWINDOW و ...
از or بیتی که | هست استفاده میشه تا فلگ ها با هم ترکیب بشن. دقیقا نمیدونم کدوم باید برای کار شما انتخاب بشه تست کنید.
این فلگ ها در تابع CreateWindow استفاده میشه به عنوان ورودی.

r0ot$harp
جمعه 30 فروردین 1392, 15:00 عصر
تشکر دوست عزیز

یه سوالی دارم. قبل گفتم می خوام یه Credential Provider برای ویندوز بنویسم. یعنی اینکه می خوام ورود به ویندوز رو تغییر بدم و از راه های مختلف مثل استفاده Token, Smart Card, USB و... کنم. مشکلی که دارم روی Dialog هست. یعنی نمی تونم از GUI استفاده کنم. الان Dialog باز می شه اما مشکل اینه که زمانی که Dialog باز می شه تا زمانی که بسته نشه به هیچ عنوان ورود به ویندوز انجام نمی شه. انگار کل Thread ها رو نگه می داره تا زمانی که خودش بسته بشه. حالا سوالی که دارم اینه که چه جوری Dialog رو داخل یه Thread باز کنم؟؟؟


باتشکر احسان