ورود

View Full Version : مشکل صف پیغام ویندوز



Ceytar
دوشنبه 24 بهمن 1390, 18:33 عصر
این برنامه هنوز کامل نشده(اجرا می شه،ولی هنوز بخش هایش مونده) ، دو تا مشکل دارم . بازیی هست که (نسخه جاوا اسکریپتش رو احتمالا تو نت دیدید) فرضا 5 6 تا مربع باشه که سریع و راندوم حرکت می کنن و کاربر هم یک مربع داره و اون رو حرکت می ده ... اگر مربع ها همپوشانی داشته باشن کاربر ببازه !!

اولی ساده است : چطور می تونم یه جا مثلا وقتی می خوام بلافاصله ویندوز به تابع مدیریت پنجره من پیغام WM_PAINT بفرسته ؟ این رو هم مثل پاینی یه حالت بلافاصله و real time می خوام .

دومی اینه : اگه این برنامه رو کامپایل کنید می بینید که مربع رو می شه کشید اون ور این ور ... ولی یه حالت real time نیست . مثلا وقتی یه کم سریع تر بخوایی موس رو حرکت بدید . مربع جا می مونه . فکر کنم این بخاطر اینکه که ویندوز message queue برای پنجره رو با WM_MOUSEMOVE پر نمی کنه و یه نوعی فقط مقداری که قابل پردازش هست برای برنامه می فرسته . حالا سوال من اینه . من فکر می کنم با چند نخی بشه این رو پیاده کرد که یه حالت realtime باشه . ولی چون چند نخی بلد نیستم و این برنامه رو هم برا تفریح می نوشتم راه دیگه ای هست ؟؟ مثلا تابعی که به ویندوز اطلاع بده تمام event های موس رو بدون کم و کسری برا پردازش بفرسته و یا یه همچین چیزی ؟؟



سوال سوم: سوالم اینه که چطوری می شه برای سایز برنامه محدودیت قائل شد ؟ مثلا از یه حد کوچیکتر نشه (حالا بزرگتر مشکل نداره) ؟؟ با چه توابعی ؟؟







#include <windows.h>


LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int drawsq(HDC ,POINT *);
void setq(int x , int y,POINT *pt);

static TCHAR ncls[] = TEXT ("test") ;
static int siq = 25 ;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE
hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
MSG msg ;
WNDCLASS wc ;
HWND hwnd ;

wc.cbClsExtra = NULL ;
wc.cbWndExtra = NULL ;
wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wc.hInstance = hInstance ;
wc.lpfnWndProc = WndProc ;
wc.lpszMenuName = NULL ;
wc.style = CS_HREDRAW | CS_VREDRAW ;
wc.lpszClassName = ncls ;

if (!RegisterClass (&wc))
{
MessageBox (NULL, TEXT ("This program requires NT!!"),
ncls, MB_ICONERROR) ;
return 0 ;
}

hwnd = CreateWindow(ncls,L"test",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NU LL);

ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while( GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}


int drawsq(HDC hdc,POINT *pt){
int i = 0 ;
SelectObject (hdc , GetStockObject (GRAY_BRUSH)) ;
for(i = 0 ; i < 2 ; i++){
MoveToEx (hdc, (pt+i)->x, (pt+i)->y, NULL);
LineTo(hdc, (pt+i+1)->x, (pt+i+1)->y) ;
}
MoveToEx (hdc, (pt+3)->x, (pt+3)->y, NULL);
LineTo(hdc, (pt)->x, (pt)->y) ;

SetPolyFillMode (hdc, ALTERNATE) ;
Polygon (hdc, pt , 4) ;
return 0 ;
}

void setq(int x , int y,POINT *mypt){

(mypt)->x = x - (siq) ;
(mypt)->y = y - (siq) ;

(mypt+1)->x = x + (siq) ;
(mypt+1)->y = y - (siq) ;

(mypt+2)->x = x + (siq) ;
(mypt+2)->y = y + (siq) ;

(mypt+3)->x = x - (siq) ;
(mypt+3)->y = y + (siq) ;
return ;
}


LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wP,LPARAM lP ){

HDC hdc ;
static POINT mypt[4];
static int cxClient,cyClient,tmpx,tmpy,x,y;
PAINTSTRUCT ps ;
RECT rt ;

switch(msg)
{
case WM_CREATE:
{
GetClientRect(hwnd,&rt);
cxClient = rt.right - rt.left ;
cyClient = rt.bottom - rt.top ;
tmpx = cxClient/2;
tmpy = cyClient/2;
setq(tmpx,tmpy,mypt);
InvalidateRect(hwnd,NULL,TRUE);
UpdateWindow(hwnd);
return 0;
}

case WM_SIZE :
cxClient = LOWORD (lP) ;
cyClient = HIWORD (lP) ;
InvalidateRect(hwnd,NULL,TRUE);
UpdateWindow(hwnd);
SendMessage(hwnd,WM_PAINT,NULL,NULL);
return 0 ;

case WM_MOUSEMOVE:
{
if (!(wP & MK_LBUTTON))
return 0;
x = LOWORD (lP) ;
y = HIWORD (lP) ;
if( ( x > mypt[0].x) && (x < mypt[1].x) && (x < mypt[2].x) && (x > mypt[3].x) ){
if( ( y > mypt[0].y) && (y > mypt[1].y) && (y < mypt[2].y) && (y < mypt[3].y) ){
setq(x,y,mypt);
InvalidateRect (hwnd,NULL, TRUE) ;
UpdateWindow(hwnd);
SendMessage(hwnd,WM_PAINT,NULL,NULL);
}
}
return 0 ;
}
case WM_LBUTTONUP:
{
InvalidateRect(hwnd,NULL,FALSE);
UpdateWindow(hwnd);
return 0;
}
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
case WM_PAINT:
{
hdc = BeginPaint(hwnd,&ps);
drawsq(hdc,mypt);
EndPaint (hwnd, &ps) ;
break;
}
}
return DefWindowProc(hwnd, msg, wP, lP);
}

pe32_64
دوشنبه 24 بهمن 1390, 20:27 عصر
ولی ساده است : چطور می تونم یه جا مثلا وقتی می خوام بلافاصله ویندوز به تابع مدیریت پنجره من پیغام WM_PAINT بفرسته ؟ این رو هم مثل پاینی یه حالت بلافاصله و real time می خوام .

دومی اینه : اگه این برنامه رو کامپایل کنید می بینید که مربع رو می شه کشید اون ور این ور ... ولی یه حالت real time نیست . مثلا وقتی یه کم سریع تر بخوایی موس رو حرکت بدید . مربع جا می مونه . فکر کنم این بخاطر اینکه که ویندوز message queue برای پنجره رو با WM_MOUSEMOVE پر نمی کنه و یه نوعی فقط مقداری که قابل پردازش هست برای برنامه می فرسته . حالا سوال من اینه . من فکر می کنم با چند نخی بشه این رو پیاده کرد که یه حالت realtime باشه . ولی چون چند نخی بلد نیستم و این برنامه رو هم برا تفریح می نوشتم راه دیگه ای هست ؟؟ مثلا تابعی که به ویندوز اطلاع بده تمام event های موس رو بدون کم و کسری برا پردازش بفرسته و یا یه همچین چیزی ؟؟

با تابع;() InvalidateRect که استفاد هم کردید.
البته با کد نویسی بهتر می شه برنامتون رو بهبود بخشید.
ولیبه صورت Real-time باید ازDirectX (http://en.wikipedia.org/wiki/DirectX)یا OpenGl (http://en.wikipedia.org/wiki/OpenGL)استفاده کنید.(شما از GDI (http://en.wikipedia.org/wiki/Graphics_Device_Interface) , و خود Windows API استفاده کردید)



سوال سوم: سوالم اینه که چطوری می شه برای سایز برنامه محدودیت قائل شد ؟ مثلا از یه حد کوچیکتر نشه (حالا بزرگتر مشکل نداره) ؟؟ با چه توابعی ؟؟تکه کد زیر به برنامه ی ،5 مگا بایت افزایش حجم میده.
اگه خواستید با دیگر انواع فایلها یا حتی دیگر برنامه ها کد رو استفاده کنید ، حتما مطمئن شید که فایل مورد نظر خراب نشه

HANDLE hAppend = CreateFile(TEXT("c:\\wrar410.exe"), // open Two.txt
FILE_WRITE_DATA, // open for writing
FILE_SHARE_READ, // allow multiple readers
NULL, // no security
OPEN_EXISTING, // open or create
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no attr. template

if (hAppend != INVALID_HANDLE_VALUE)
{
SetFilePointer(hAppend,5242880,0,FILE_END);
SetEndOfFile(hAppend);
CloseHandle(hAppend);
}

Ceytar
دوشنبه 24 بهمن 1390, 20:57 عصر
درمورد سوال اول ، دوم ممنون ...
کدهارو قاطی پاتی نوشته بودم ...

در مورد سوال سوم عذر می خوام سوالم رو اشتباهی (با لفظ) پرسیدم .
صحیح ترش اینه :
می خوام برای سایز Window یه محدودیت قائل بشم.فکر کنم باید با این انجامش بدم : WM_GETMINMAXINFO
می تونید کمی توضیح بدید ؟؟

pe32_64
دوشنبه 24 بهمن 1390, 21:52 عصر
می خوام برای سایز Window یه محدودیت قائل بشم.فکر کنم باید با این انجامش بدم : WM_GETMINMAXINFO
می تونید کمی توضیح بدید ؟؟ case WM_GETMINMAXINFO:
((LPMINMAXINFO)lParam)->ptMinTrackSize.x = 300;
((LPMINMAXINFO)lParam)->ptMinTrackSize.y = 200;
((LPMINMAXINFO)lParam)->ptMaxTrackSize.x = 600;
((LPMINMAXINFO)lParam)->ptMaxTrackSize.y = 600;
به ترتیب:
xحداقل
yحداقل
xحداکثر
yحداکثر

Ceytar
چهارشنبه 26 بهمن 1390, 00:44 صبح
82699


این همون برنامه بالاست (کدش بالاست) با یه زبون دات نتی پیاده شده
خوب سوال من اینه که درسته این برنامه ساده است ... اصلا بحث هم مقایسه دات نت و win32 نیست
(در ضمن کد ها تقریبا سطر به سطر همون کد های win32 تو دات نت پیاده شدن) چرا بدون اینکه تو دات نت از دایرکت ایکس یا opengl استفاده کنیم . event های موس اینقدر دینامیک تر هست . یا من اشتباه می کنم و دات نت برای ایجاد شی هاش از directX استفاده می کنه ؟؟

pe32_64
پنج شنبه 27 بهمن 1390, 20:51 عصر
net.خودش قسمتهایی رو اتوماتیک مدیریت می کنه