PDA

View Full Version : کمک در مورد یک تابع API



Hamedm
جمعه 30 بهمن 1383, 16:16 عصر
سلام دوستان :)

کسی میدونه پارامتر آخر تابع API زیر چه کاری میکنه؟ ورودیهای این پارامتر چیه؟

Function InsertMenuItem Lib "user32.dll" Alias "InsertMenuItemA" (ByVal hMenu As Long, ByVal uItem As Long, ByVal fByPosition As Long, lpmii As MENUITEMINFO) As Long
منظورم lpmii است.
خیلی فوریه.

موفق باشید و پرتوان

حامد مصافی
جمعه 30 بهمن 1383, 17:46 عصر
Type MENUITENINFO
cbSize As Long
fMask As Long
fType As Long
fState As Long
wID As Long
hSunMenu As Long
hBmpChecked As Long
hBmpUnchecked As Long
dwItemData As Long
cch As Long
End Type


cbSize : طول کل نوع که باید توسط تابع برگردانده شود

fMask : بخش های در خواستی برنامه نویس را مشخص می کند
از می خواهید fState استفاده کنید = &H1
از می خواهید wID استفاده کنید = &H2
از می خواهید hSubMenu استفاده منید = &H4
از می خواهید دو فیلد تصویر ( حالت انتخاب و غیر انتخاب ) استفاده کنید = &H8
از می خواهید dwItemData استفاده کنید = &H20
از می خواهید dwtypeData استفاده کنید = &H10

fType : نوع منو را مشخص می کند
به جای منو فقط یک عکس قرار می گیرد = &H4
منوی قبلی خاتمه پیدا می کند و یک ردیف جدید شروع می شود = &H20
مانند حالت قبلی است ولی در این حالت خط جدا کننده در منو رسم نمی شود = &H40
به جای علامت چک یک نقطه ( رادیو چک ) را در منو به کار می برد = &H200
راست به چپ = &H4000
خط جدا کننده دو منو = &H800
نوشته منو نیز نمایش داده شود = &H0 (پیش فرض)

fState : حالت پیش فرض منو را تعیین می کند
منو به طور پیش فرض چک خورده است = &H8
منوی پیش فرض ویندوز = &H1000
غیر فعال = &H2
خاکستری = &H1
های لایت = &H80

wID : این بافر توسط تابع مقدار دهی می شود و حاوی آی دی منو خواهد بود

hSubMenu : این بافر توسط تابع مقدار دهی می شود و بیانگر این است که آیا منوی مزیور زیر منو است (یک )یا نه (صفر )

hBmpChecked : تصویری که باید در حالت انتخاب در منو ظاهر شود

hBmpUnchecked : تصویری که باید در حالت غیرانتخاب در منو ظاهر شود

dwItemData : این فیلد توسط ویندوز استفاده نمی شود (در واقع tag یک منو است)

cch : اگر منو شامل نام باشد ( در فیلد fType مشخص شده یاشد ) آنگاه این متغیر را باید برابر نوشته منو قرار دهید

Hamedm
جمعه 30 بهمن 1383, 17:52 عصر
BlackDal جان دستت درد نکنه :flower: :flower: . نمیدونی چه کمک بزرگی به من کردی.

موفق باشید و پرتوان

حامد مصافی
جمعه 30 بهمن 1383, 18:34 عصر
:mrgreen:
خواهش میشه!

بابک زواری
شنبه 01 اسفند 1383, 07:17 صبح
اینم یک مثال



' Declarations and such needed for the example:
' (Copy them to the (declarations) section of a module.)
' There's quite a few declarations for this example, but it's worth it!
Public Declare Function GetSystemMenu Lib "user32.dll" (ByVal hWnd As Long, ByVal bRevert As Long) As Long
Public Declare Function GetMenuItemCount Lib "user32.dll" (ByVal hMenu As Long) As Long
Public Type MENUITEMINFO
cbSize As Long
fMask As Long
fType As Long
fState As Long
wID As Long
hSubMenu As Long
hbmpChecked As Long
hbmpUnchecked As Long
dwItemData As Long
dwTypeData As String
cch As Long
End Type
Public Const MIIM_STATE = &H1
Public Const MIIM_ID = &H2
Public Const MIIM_TYPE = &H10
Public Const MFT_SEPARATOR = &H800
Public Const MFT_STRING = &H0
Public Const MFS_ENABLED = &H0
Public Const MFS_CHECKED = &H8
Public Declare Function InsertMenuItem Lib "user32.dll" Alias "InsertMenuItemA" (ByVal hMenu As Long, ByVal uItem As Long, ByVal fByPosition As Long, lpmii As MENUITEMINFO) As Long
Public Declare Function SetMenuItemInfo Lib "user32.dll" Alias "SetMenuItemInfoA" (ByVal hMenu As Long, ByVal uItem As Long, ByVal fByPosition As Long, lpmii As MENUITEMINFO) As Long
Public Declare Function SetWindowPos Lib "user32.dll" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = -4
Public Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const WM_SYSCOMMAND = &H112
Public Const WM_INITMENU = &H116

' Add an option to make window Form1 "Always On Top" to the bottom of its system
' menu. A check mark appears next to this option when active. The menu item acts as a toggle.
' Note how subclassing the window is necessary to process the two messages needed
' to give the added system menu item its full functionality.

' *** Place the following code in a module. ***

Public pOldProc As Long ' pointer to Form1's previous window procedure
Public ontop As Boolean ' identifies if Form1 is always on top or not

' The following function acts as Form1's window procedure to process messages.
Public Function WindowProc (ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim hSysMenu As Long ' handle to Form1's system menu
Dim mii As MENUITEMINFO ' menu item information for Always On Top
Dim retval As Long ' return value

Select Case uMsg
Case WM_INITMENU
' Before displaying the system menu, make sure that the Always On Top
' option is properly checked.
hSysMenu = GetSystemMenu(hwnd, 0)
With mii
' Size of the structure.
.cbSize = Len(mii)
' Only use what needs to be changed.
.fMask = MIIM_STATE
' If Form1 is now always on top, check the item.
.fState = MFS_ENABLED Or IIf(ontop, MFS_CHECKED, 0)
End With
retval = SetMenuItemInfo(hSysMenu, 1, 0, mii)
WindowProc = 0
Case WM_SYSCOMMAND
' If Always On Top (ID = 1) was selected, change the on top/not on top
' setting of Form1 to match.
If wParam = 1 Then
' Reverse the setting and make it the current one.
ontop = Not ontop
retval = SetWindowPos(hwnd, IIf(ontop, HWND_TOPMOST, HWND_NOTOPMOST), 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
WindowProc = 0
Else
' Some other item was selected. Let the previous window procedure
' process it.
WindowProc = CallWindowProc(pOldProc, hwnd, uMsg, wParam, lParam)
End If
Case Else
' If this is some other message, let the previous procedure handle it.
WindowProc = CallWindowProc(pOldProc, hwnd, uMsg, wParam, lParam)
End Select
End Function

' *** Place the following code inside Form1. ***

' When Form1 loads, add Always On Top to the system menu and set up the
' new window procedure.
Private Sub Form_Load()
Dim hSysMenu As Long ' handle to the system menu
Dim count As Long ' the number of items initially on the menu
Dim mii As MENUITEMINFO ' describes a menu item to add
Dim retval As Long ' return value

' Get a handle to the system menu.
hSysMenu = GetSystemMenu(Form1.hWnd, 0)
' See how many items are currently in it.
count = GetMenuItemCount(hSysMenu)

' Add a separator bar and then Always On Top to the system menu.
With mii
' The size of the structure.
.cbSize = Len(mii)
' What parts of the structure to use.
.fMask = MIIM_ID Or MIIM_TYPE
' This is a separator.
.fType = MFT_SEPARATOR
' It has an ID of 0.
.wID = 0
End With
' Add the separator to the end of the system menu.
retval = InsertMenuItem(hSysMenu, count, 1, mii)

' Likewise, add the Always On Top command.
With mii
.fMask = MIIM_STATE Or MIIM_ID Or MIIM_TYPE
' This is a regular text item.
.fType = MFT_STRING
' The option is enabled.
.fState = MFS_ENABLED
' It has an ID of 1 (this identifies it in the window procedure).
.wID = 1
' The text to place in the menu item.
.dwTypeData = "&Always On Top"
.cch = Len(.dwTypeData)
End With
' Add this to the bottom of the system menu.
retval = InsertMenuItem(hSysMenu, count + 1, 1, mii)

' Set the custom window procedure to process Form1's messages.
ontop = False
pOldProc = SetWindowLong(Form1.hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

' Before unloading, restore the default system menu and remove the
' custom window procedure.
Private Sub Form_Unload(Cancel As Integer)
Dim retval As Long ' return value

' Replace the previous window procedure to prevent crashing.
retval = SetWindowLong(Form1.hWnd, GWL_WNDPROC, pOldProc)
' Remove the modifications made to the system menu.
retval = GetSystemMenu(Form1.hWnd, 1)
End Sub

Hamedm
شنبه 01 اسفند 1383, 07:31 صبح
اینم یک مثال

آقای زواری از بابت مثال دستتون درد نکنه :flower: ولی خودم کلی مثال داشتم. توی یک از همین مثالهای خودم بود که نفهمیدم پارامتر آخر این تابع چه کار میکنه.

موفق باشید و پرتوان

jk
شنبه 15 مرداد 1384, 16:24 عصر
جناب زواری مثالی که تو این قسمت گذاشتید یک قسمت کلی از برنامه نشون داده نمی شه ....

ممنون می شم اگه تصحیح کنید

jk
شنبه 15 مرداد 1384, 16:25 عصر
منویی که توسط Api طراحی شده به چه شکلی راست چین می شه؟

حامد مصافی
شنبه 15 مرداد 1384, 17:41 عصر
سلام
راست چین بودن منو توسط پنجره صاحب منو تعیین میشه
اگر فرم صاحب منو rtl باشه منو هم rtl خواهد بود