سئوالات مربوط به Windows Api

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون استاد علی
توی WM_DEVICECHANGE message :

WM_DEVICECHANGE message (Windows)

مقدار آرگومان دوم uMsg که گفت شناسه ی WM_DEVICECHANGE identifier هست ، مقدار شناسه اش چه عددی هه؟
جستجو کردم مقدارشو پیدا نکردم
نمیدونم چرا مایکروسافت بعضی از راهنماشو نمیگه! قبلا هم یه مورد شبیه این بود که با جستجو از سایت های دیگه گرفتم

برای مدیریت سخت افزار (مثلا اتصال دستگاه usb جدید) ، همین پیام کافی هه دیگه . درسته؟
حذف و اضافه کردن device مثل usb هم با رویداد DBT_DEVICEARRIVAL هه دیگه . درسته؟ :

DBT_DEVICEARRIVAL event (Windows)

ویرایش :
مقدار WM_DEVICECHANGE برابر 0x0219 هه و از لینک زیر گرفتم :

The name 'WM_DEVICECHANGE' does not exist in the current context

نمیدونم چرا مایکروسافت مقدارشو ننوشت!
لینک زیر هم برای مقادیر پیام ها مهم هه که بعدا شاید به درد بخوره . اینجا میذارم :

List of Windows Messages
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ممنون استاد علی
توی WM_DEVICECHANGE message :

WM_DEVICECHANGE message (Windows)

مقدار آرگومان دوم uMsg که گفت شناسه ی WM_DEVICECHANGE identifier هست ، مقدار شناسه اش چه عددی هه؟
جستجو کردم مقدارشو پیدا نکردم
نمیدونم چرا مایکروسافت بعضی از راهنماشو نمیگه! قبلا هم یه مورد شبیه این بود که با جستجو از سایت های دیگه گرفتم
این چیزی که شما دنبالش میگردید راهنما نیست، راهنما بر اساس نامی است که مایکروسافت تعریف کرده. شما دارید یک مقدار ثابتی رو که مایکروسافت در API اش قبلا تعریف کرده و در header نوشته و مقدار داره رو مجددا در کدتون از نو تعریف میکنید. برای همینه که در راهنما پیداش نمی کنید، راهنما نمیخواد بگه چطور این نام رو از نو تعریف کنید، میخواد بگه برای چه منظوری ازش استفاده کنید. در همون راهنمای WM_DEVICECHANGE هم نوشته که در کدوم فایل ها این مقدار ثابت تعریف شده. مربوط به Include های SDK ئه ولی چون Windows SDK رو هم احتمالا بصورت کامل و با Include ها ندارید، می توانید در گوگل define WM_DEVICECHANGE رو جستجو کنید تا سطر تعریفش رو براتون پیدا کنه. define عبارت کلیدی است که در کامپایلر های ++C/C مقدار ثابتی رو برای یک نام در نظر میگیرند.

برای مدیریت سخت افزار (مثلا اتصال دستگاه usb جدید) ، همین پیام کافی هه دیگه . درسته؟
حذف و اضافه کردن device مثل usb هم با رویداد DBT_DEVICEARRIVAL هه دیگه . درسته؟ :
DBT_DEVICEARRIVAL event (Windows)
خودتون لینک راهنما میدید ولی خودتون هم مطالعه اش نمی کنید، خیر ربطی به حذف کردن نداره.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون
میگم ، اشاره گرها (در api ویندوز) ، علامت دار هستن یا علامت ندار؟
مثلا اشاره گر LPCSTR ، اولا که در اتوپلی ، 32 بیتی میشه دیگه؟ چون اتوپلی 32 بیتی هست؟ درسته؟ (یعنی ربطی به 32 یا 64 بیت بودن ویندوز که نداره؟ اگه درست یادم بیاد ، قبلا گفتین به برنامه ی استفاده شده ربط داره نه به ویندوز)
و دوما علامت دار هه یا علامت ندار؟ یعنی باید Int واسش در نظر بگیریم یا UInt ؟
آدرس حافظه که منفی نداریم . پس همه ی اشاره گرها باید مثبت یا همون علامت ندار باشن دیگه . درسته؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ممنون
میگم ، اشاره گرها (در api ویندوز) ، علامت دار هستن یا علامت ندار؟
مثلا اشاره گر LPCSTR ، اولا که در اتوپلی ، 32 بیتی میشه دیگه؟ چون اتوپلی 32 بیتی هست؟ درسته؟ (یعنی ربطی به 32 یا 64 بیت بودن ویندوز که نداره؟ اگه درست یادم بیاد ، قبلا گفتین به برنامه ی استفاده شده ربط داره نه به ویندوز)
بله، 32 بیتی ئه چون ویندوز 64 بیتی هم اون برنامه رو بصورت 32 بیتی اجرا می کنه.
و دوما علامت دار هه یا علامت ندار؟ یعنی باید Int واسش در نظر بگیریم یا UInt ؟
آدرس حافظه که منفی نداریم . پس همه ی اشاره گرها باید مثبت یا همون علامت ندار باشن دیگه . درسته؟
آدرس منفی ندارید، اما اینکه از Int استفاده کنید، مشکلی از لحاظ ذخیره سازی آدرس ایجاد نمی کنه، در خود C++/C هم همچین مواردی هست که از انواع داده علامت دار برای آدرس اشاره گر استفاده میشه، بدون در نظر گرفتن این واقعیت که منفی بودنش بی معنی ئه. آدرس حافظه ذاتا یک عدد صحیح فاقد علامت ئه اما از اونجایی که بیت علامت بصورت متعارف صفر بوده، مقدار signed و unsigned اش تفاوتی نداشته که بین دو مقدار با علامت و بدون علامت اختلافی پیش بیاد، از لحاظ فضای ذخیره سازی هم که یکسان هستند. در خیلی موارد هم جاهایی که مقدار اصولا فاقد علامت ئه از نوع داده علامت دار استفاده شده، مثل IntPtr یا Array.Length و Stream.Position و ... این انتخاب ها به این معنی نیست که فرضا طول آرایه میتونسته منفی باشه.
احتمالش در کد های شما صفر ئه اما از لحاظ تکنیکی ممکنه حالتی پیش بیاد که آدرس حافظه فراتر از محدوده اعداد مثبت Int باشه و در متغیر علامت دار بصورت عدد منفی تفسیر بشه، اما چون صرفا بصورت آدرس 32 بیتی تفسیرش می کنید، این منفی بودن مشکلی ایجاد نمی کنه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون
بعد اینکه میدونین چرا در کد زیر ، دیالوگ فونت باز نمیشه؟ :


کد:
CF_SCREENFONTS = 0x00000001;
CF_FORCEFONTEXIST = 0x00010000;
CF_INACTIVEFONTS = 0x02000000;
CF_SCALABLEONLY = 0x00020000;
CF_INITTOLOGFONTSTRUCT = 0x00000040;
CF_EFFECTS = 0x00000100;
custFlags = Bitwise.Or(CF_EFFECTS, CF_SCREENFONTS, CF_FORCEFONTEXIST, CF_INACTIVEFONTS, CF_SCALABLEONLY, CF_INITTOLOGFONTSTRUCT);


hdlDll = Library.Load("Comdlg32.dll", false);
if(hdlDll) then
structCHOOSEFONT = MemoryEx.DefineStruct(
{
UINT("lStructSize");
INT("hwndOwner");
INT("hDC");
UINT("lpLogFont");
INT("iPointSize");
UINT("Flags");
UINT("rgbColors");
UINT("lCustData");
UINT("lpfnHook");
UINT("lpTemplateName");
INT("hInstance");
UINT("lpszStyle");
WORD("nFontType");
WORD("alignment");  -- alignment field  ezafi baraye tanzim
INT("nSizeMin");
INT("nSizeMax");
}
);

structSize = MemoryEx.StructSize(structCHOOSEFONT);
ptrStructCHOOSEFONT = MemoryEx.Allocate(structSize);
hCHOOSEFONT = MemoryEx.AssignStruct(ptrStructCHOOSEFONT, structCHOOSEFONT);

hCHOOSEFONT.lStructSize = structSize;
hCHOOSEFONT.hwndOwner = mainWinHdl;
hCHOOSEFONT.Flags = CF_EFFECTS;

isOkClicked = hdlDll.ChooseFontA(ptrStructCHOOSEFONT);
    if (isOkClicked) then
   
    end
end

فقط اگه فیلد Flags برابر CF_EFFECTS باشه درست کار میکنه ولی اگه or کنم ، دیالوگ فونت باز نمیشه
 

the_king

مدیرکل انجمن
ممنون
بعد اینکه میدونین چرا در کد زیر ، دیالوگ فونت باز نمیشه؟ :


کد:
CF_SCREENFONTS = 0x00000001;
CF_FORCEFONTEXIST = 0x00010000;
CF_INACTIVEFONTS = 0x02000000;
CF_SCALABLEONLY = 0x00020000;
CF_INITTOLOGFONTSTRUCT = 0x00000040;
CF_EFFECTS = 0x00000100;
custFlags = Bitwise.Or(CF_EFFECTS, CF_SCREENFONTS, CF_FORCEFONTEXIST, CF_INACTIVEFONTS, CF_SCALABLEONLY, CF_INITTOLOGFONTSTRUCT);


hdlDll = Library.Load("Comdlg32.dll", false);
if(hdlDll) then
structCHOOSEFONT = MemoryEx.DefineStruct(
{
UINT("lStructSize");
INT("hwndOwner");
INT("hDC");
UINT("lpLogFont");
INT("iPointSize");
UINT("Flags");
UINT("rgbColors");
UINT("lCustData");
UINT("lpfnHook");
UINT("lpTemplateName");
INT("hInstance");
UINT("lpszStyle");
WORD("nFontType");
WORD("alignment");  -- alignment field  ezafi baraye tanzim
INT("nSizeMin");
INT("nSizeMax");
}
);

structSize = MemoryEx.StructSize(structCHOOSEFONT);
ptrStructCHOOSEFONT = MemoryEx.Allocate(structSize);
hCHOOSEFONT = MemoryEx.AssignStruct(ptrStructCHOOSEFONT, structCHOOSEFONT);

hCHOOSEFONT.lStructSize = structSize;
hCHOOSEFONT.hwndOwner = mainWinHdl;
hCHOOSEFONT.Flags = CF_EFFECTS;

isOkClicked = hdlDll.ChooseFontA(ptrStructCHOOSEFONT);
    if (isOkClicked) then
  
    end
end

فقط اگه فیلد Flags برابر CF_EFFECTS باشه درست کار میکنه ولی اگه or کنم ، دیالوگ فونت باز نمیشه
بله دیگه، فلگ CF_INITTOLOGFONTSTRUCT رو بکار بردید که وابسته به مقدار lpLogFont ئه. گفتید موقع اجرا فونتی رو انتخاب کنه در اون LOGFONT مشخص کردید. مادامی که تمایلی به معرفی یک ساختار معتبر و مقدار دهی شده LOGFONT نداشته باشید همین مشکل پیش میاد.
ChooseFont should use the structure pointed to by the lpLogFont member to initialize the dialog box controls
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بله
ممنون استاد علی
میگم در لینک زیر :

CHOOSEFONT structure (Windows)

فیلد iPointSize را باید چجوری مقداردهی کرد تا اندازه ی فونت بصورت پیش فرض مشخص بشه؟
یعنی چی که نوشته "in units of 1/10 of a point" ؟
بعد از اینکه دیالوگ باز میشه و اندازه ی مثلا 12 را انتخاب میکنم ، مقدار این فیلد ، ضربدر 10 میشه و 120 میشه
اما مقدار این فیلد را 120 که میدم ، سایز موقع نمایش دیالوگ فونت ، روی 12 نمیاد و هیچ چی انتخاب نمیشه
عدد اعشاری هم که نمیتونم بدم چون int هه
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بعد اینکه باید چی کار کرد ا رنگ های بیشتری در دیالوگ فونت را برای انتخاب مشخص کنه؟ مثلا موقع انتخاب رنگ در دیالوگ فونت ، آیکون یا گزینه ای برای انتخاب دیالوگ رنگ هم بذاره؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
توی اتوپلی کد زیر را نوشتم :

کد:
WM_NCMOUSELEAVE = 0x02A2;

function EventHandler(hWnd, uMsg, wParam, lParam)
    if (hWnd == mainWinHdl and uMsg == WM_NCMOUSELEAVE) then
    Dialog.Message("Notice", "mouse leave NC main windows", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
    end

return Subclass.OldWinProc(hWnd, uMsg, wParam, lParam);
end

ولی هم موقع خروج موس از پنجره (اصلی) و هم موقع ورودش ، رویداد اجرا میشه . در پیام WM_NCMOUSELEAVE :

WM_NCMOUSELEAVE message (Windows)

باید کجا را دستکاری کرد تا فقط وقتی ازش خارج میشیم ، رویداد (شرط if در بالا) فقط اجرا بشه؟ (وابستگی به کدهای اتوپلی نمیخوام داشته باشه . اون جوری رو میدونم . منظورم دستکاری در api هست)
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ولی هم موقع خروج موس از پنجره (اصلی) و هم موقع ورودش ، رویداد اجرا میشه . در پیام WM_NCMOUSELEAVE :

WM_NCMOUSELEAVE message (Windows)

باید کجا را دستکاری کرد تا فقط وقتی ازش خارج میشیم ، رویداد (شرط if در بالا) فقط اجرا بشه؟ (وابستگی به کدهای اتوپلی نمیخوام داشته باشه . اون جوری رو میدونم . منظورم دستکاری در api هست)
مربوط به خروجه، ربطی به ورود نداره، اون WM_NCMOUSEHOVER ئه، یکجایی از روال کار تون ایراد داره. و البته اینجور رخداد ها رو با موردی که خودش Focus و Capture می کنه مثل نمایش MessageBox نمی توانید درست تست کنید.

بله
ممنون استاد علی
میگم در لینک زیر :

CHOOSEFONT structure (Windows)

فیلد iPointSize را باید چجوری مقداردهی کرد تا اندازه ی فونت بصورت پیش فرض مشخص بشه؟
یعنی چی که نوشته "in units of 1/10 of a point" ؟
بعد از اینکه دیالوگ باز میشه و اندازه ی مثلا 12 را انتخاب میکنم ، مقدار این فیلد ، ضربدر 10 میشه و 120 میشه
اما مقدار این فیلد را 120 که میدم ، سایز موقع نمایش دیالوگ فونت ، روی 12 نمیاد و هیچ چی انتخاب نمیشه
عدد اعشاری هم که نمیتونم بدم چون int هه
سایز فونت انتخاب شده است، ورودی نیست که شما مشخص کنید، خروجیه. شما برای فونت پیشفرض و سایزش باید با lpLogFont کار کنید.

بعد اینکه باید چی کار کرد ا رنگ های بیشتری در دیالوگ فونت را برای انتخاب مشخص کنه؟ مثلا موقع انتخاب رنگ در دیالوگ فونت ، آیکون یا گزینه ای برای انتخاب دیالوگ رنگ هم بذاره؟
دو تا کار میشه کرد، روش اول با ارث بری از کلاس دیالوگ پیشفرض انجام میشه که بنابر این باید با کامپایلر های ویژوال ++C انجامش بدید، نه در اتوپلی، بدین ترتیب که یک Template اختصاصی برای اون دیالوگ بسازید و با پارامتر lpTemplateName مشخصش کنید. روش دوم اینه که یک پروسه برای lpfnHook در نظر بگیرید که موقع ساختن دیالوگ پنجره اون کنترل اختصاصی خودتون رو بهش اضافه کنید (Parent اش رو تنظیم کنید) و موقع تغییر رنگ روی دیالوگ اصلی تغییرات رو اعمال کنید که اونم قاعدتا کاری نیست که اتوپلی بتونه انجام بده.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
مربوط به خروجه، ربطی به ورود نداره، اون WM_NCMOUSEHOVER ئه، یکجایی از روال کار تون ایراد داره. و البته اینجور رخداد ها رو با موردی که خودش Focus و Capture می کنه مثل نمایش MessageBox نمی توانید درست تست کنید.


سایز فونت انتخاب شده است، ورودی نیست که شما مشخص کنید، خروجیه. شما برای فونت پیشفرض و سایزش باید با lpLogFont کار کنید.


دو تا کار میشه کرد، روش اول با ارث بری از کلاس دیالوگ پیشفرض انجام میشه که بنابر این باید با کامپایلر های ویژوال ++C انجامش بدید، نه در اتوپلی، بدین ترتیب که یک Template اختصاصی برای اون دیالوگ بسازید و با پارامتر lpTemplateName مشخصش کنید. روش دوم اینه که یک پروسه برای lpfnHook در نظر بگیرید که موقع ساختن دیالوگ پنجره اون کنترل اختصاصی خودتون رو بهش اضافه کنید (Parent اش رو تنظیم کنید) و موقع تغییر رنگ روی دیالوگ اصلی تغییرات رو اعمال کنید که اونم قاعدتا کاری نیست که اتوپلی بتونه انجام بده.

ممنون استاد علی
کدوم فیلد از استراکچر LogFont ، باعث تنظیم سایز میشه (موقع نمایش دیالوگ فونت) ؟
من توی این استراکچر ، چیز خاصی که به سایز مربوط بشه را پیدا نکردم
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f

ممنون
ولی این چه اسم و توضیحی هه که براش انتخاب کردن! چه ربطی به اندازه داشت!
حالا مقدارشو که مثلا 12 میذارم ، موقع نمایش دیالوگ ، اندازه روی 9 میره . روی 22 که میذارم ، روی 17 میره .
چجوری هه؟!
 

the_king

مدیرکل انجمن
ممنون
ولی این چه اسم و توضیحی هه که براش انتخاب کردن! چه ربطی به اندازه داشت!
حالا مقدارشو که مثلا 12 میذارم ، موقع نمایش دیالوگ ، اندازه روی 9 میره . روی 22 که میذارم ، روی 17 میره .
چجوری هه؟!
ارتفاع فونت ئه دیگه، شما سایز فونت رو بر اساس چه معیاری میسنجید؟ سایز فونت بر اساس ارتفاع فونت ئه. توضیحاتش رو اگه بخونید که طبق معمول نمی خونید نوشته که واحدش em ئه که هر em معادل 1/72inch میشه، طبعا وقتی واحدش point نباشه مقادیرشون هم نباید برابر باشه. در نمایشگری که 96dpi باشه، نسبت 72 به 96 و بالعکس رو باید ضریب قرار بدید. 9 = 96 / 72 * 12 و 16.5 = 96 / 72 * 22
 

جدیدترین ارسال ها

بالا