[SourcePawn] Урок 7 - Панели и Меню

bimbo

Участник
Сообщения
5
Реакции
0
Привет, буду благодарен, если поможете изменить функцию плагина.
В данном виде, при вызове игроком Меню, оно появляется у всех и идёт выбор большинством голосов за определенный его пункт.
А мне хотелось бы, чтобы при вызове Меню игроков, оно появлялось только у него, и далее при выборе им определенного пункта, он уже выставлялся бы на голосование всем остальным.

...:
#define CHAT_FORMAT        "\x01","\x04","[GameConfig]","\x01","\x03","\x01","\x05","\x01"
#define CONF_PATH        "sourcemod/vote_game_config"
#define MENU_ITEM        10
new const String:sAudio[][]        = {"ambient/misc/metal6.wav",    "buttons/blip2.wav",    "physics/glass/glass_cup_break2.wav"};

new Float:fCT, Float:fVE, iC[MAXPLAYERS+1], iSR, iV[MENU_ITEM+1], iVR;
public OnPluginStart()
{
    LoadTranslations("VoteGameConfiguration.phrases");
    decl Handle:c;
    HookConVarChange(c=CreateConVar("votegameconfig_elect",        "60.0",        "The duration of electing voting (seconds).\n0 - disable.",_,    true,0.0),    VE);
    fVE = GetConVarFloat(c);
    HookConVarChange(c=CreateConVar("votegameconfig_round",        "0",        "Round of voting:\n0 - begining maps; -X - only a specified, X - every."),    VR);
    if(fVE) VR(c, "","");
    AutoExecConfig(_, "VoteGameConfiguration", CONF_PATH);
    RegAdminCmd("sm_VGC",    GC, ADMFLAG_CONFIG,    "To start voting.");
    RegConsoleCmd("sm_vgc_info",    PI, "Information a status.");
    RegConsoleCmd("sm_votegame",    PV, "Open voting menu.");
}
public OnAutoConfigsBuffered() if(fVE)
{
    if(iVR==0) VCE();
    iSR = 0;
    new i=sizeof(sAudio)-1;
    do PrecacheSound(sAudio[i]);
    while(i--);
}
public OnMapEnd() if(fCT)
{
    UnhookEvent("player_spawn",    PS);
    fCT = 0.0;
}

public OnClientDisconnect_Post(C) if(iC[C])
{
    --iV[iC[C]];
    iC[C] = 0;
}

public VE(Handle:C, String:O[], String:N[]) if((fVE=GetConVarFloat(C))==0.0) VR(C, O,N);
public VR(Handle:C, String:O[], String:N[])
{
    if(iVR) UnhookEvent("round_end",    (iSR=0)<iVR ? RE:RO, EventHookMode_PostNoCopy);
    if((iVR=GetConVarInt(C))) HookEvent("round_end",    0<iVR ? RE:RO, EventHookMode_PostNoCopy);
}

public PS(Handle:E, String:N[], bool:B) MVC(GetClientOfUserId(GetEventInt(E,"userid")));
public RE(Handle:E, String:N[], bool:B) if(++iSR==iVR)
{
    if(fCT==0.0) VCE();
    iSR = 0;
}
public RO(Handle:E, String:N[], bool:B) if(--iSR==iVR) if(fCT==0.0) VCE();

public VC(Handle:P, MenuAction:A, C, O) if(A==MenuAction_Select)
{
    ++iV[iC[iV[0]=C]=O];
    EmitSound(iV,1, sAudio[1]);
}

public Action:EV(Handle:T)
{
    new i=MaxClients;
    do if(IsClientInGame(i)) if(IsFakeClient(i)==false) break;
    while(--i);
    decl String:f[9]="Config";
    if(i)
    {
        new n=MENU_ITEM, a, v;
        if(iV[0])
        {
            decl e;
            do
            {
                if(iV[n]>v) v = iV[e=n];
                a+= iV[n];
                iV[n] = 0;
            }while(--n);
            if(v)
            {
                IntToString(e, f[6],3);
                fCT = float(v*100)/a;
            }
        }decl String:b[193], String:t[96], c[i];
        n = 0;
        do if(IsClientInGame(i))
        {
            if(a)
            {
                FormatEx(t,sizeof(t), "%T", f,i);
                FormatEx(b,sizeof(b), "%T", "Decision Voters",i, CHAT_FORMAT,t);
                ReplaceString(b,2, "#","\x07");
                PrintToChat(i, b);
                FormatEx(b,sizeof(b), "%T", "Votes",i, CHAT_FORMAT,fCT,v,a);
            }else FormatEx(b,sizeof(b), "%T", "No Votes",i, CHAT_FORMAT);
            ReplaceString(b,2, "#","\x07");
            PrintToChat(c[n++]=i, b);
            iC[i] = 0;
        }while(--i);
        EmitSound(c,n, sAudio[0], _,_, SNDLEVEL_TRAIN);
    }else f = "Config0";
    ServerCommand("exec %s/%s.txt", CONF_PATH,f);
    OnMapEnd();
    iV[0] = 0;
}

public Action:GC(C, A)
{
    if(fCT) ReplyToCommand(C, "%t", "Already Vote", CHAT_FORMAT);
    else
    {
        VCE();
        C = MaxClients;
        do if(IsClientInGame(C)) MVC(C);
        while(--C);
    }return Plugin_Handled;
}
public Action:PI(C, A)
{
    if(A==MENU_ITEM)
    {
        decl String:n[24], String:v[6];
        GetPluginInfo(INVALID_HANDLE,PlInfo_Name, n,sizeof(n));
        GetPluginInfo(INVALID_HANDLE,PlInfo_Version, v,sizeof(v));
        ReplyToCommand(C, "\x01\04%s \x05v%s\x01: \x03%s", n,v,fCT ? "Performed":fVE ? "ON":"Off");
    }ReplyToCommand(C, "%t", "Info Settings", CHAT_FORMAT,fVE,iVR,iSR);
    return Plugin_Handled;
}
public Action:PV(C, A)
{
    MVC(C);
    return Plugin_Handled;
}

MVC(C) if(iC[C]==0)
{
    decl s;
    if(0 <(s=RoundToZero(fCT-GetTickedTime())))
    {
        decl String:t[200], String:f[9]="Config", Handle:p;
        FormatEx(t,sizeof(t), "%T", "Scenario",C);
        SetPanelTitle(p=CreatePanel(), t);
        new i;
        do{
            IntToString(++i, f[6],3);
            if(FormatEx(t,sizeof(t),"%T",f,C))
            {
                SetPanelCurrentKey(p, i);
                DrawPanelItem(p, t);
            }
        }while(i<MENU_ITEM);
        if(FormatEx(t,sizeof(t), "%T", "Scenario Text",C)) DrawPanelText(p, t);
        SendPanelToClient(p, iC[0]=C, VC, s);
        CloseHandle(p);
        EmitSound(iC,1, sAudio[2]);
    }
}
VCE()
{
    HookEvent("player_spawn",    PS);
    CreateTimer(fVE, EV, _, TIMER_FLAG_NO_MAPCHANGE);
    fCT = GetTickedTime()+fVE-1.0;
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Привет, буду благодарен, если поможете изменить функцию плагина.
В данном виде, при вызове игроком Меню, оно появляется у всех и идёт выбор большинством голосов за определенный его пункт.
А мне хотелось бы, чтобы при вызове Меню игроков, оно появлялось только у него, и далее при выборе им определенного пункта, он уже выставлялся бы на голосование всем остальным.

...:
#define CHAT_FORMAT        "\x01","\x04","[GameConfig]","\x01","\x03","\x01","\x05","\x01"
#define CONF_PATH        "sourcemod/vote_game_config"
#define MENU_ITEM        10
new const String:sAudio[][]        = {"ambient/misc/metal6.wav",    "buttons/blip2.wav",    "physics/glass/glass_cup_break2.wav"};

new Float:fCT, Float:fVE, iC[MAXPLAYERS+1], iSR, iV[MENU_ITEM+1], iVR;
public OnPluginStart()
{
    LoadTranslations("VoteGameConfiguration.phrases");
    decl Handle:c;
    HookConVarChange(c=CreateConVar("votegameconfig_elect",        "60.0",        "The duration of electing voting (seconds).\n0 - disable.",_,    true,0.0),    VE);
    fVE = GetConVarFloat(c);
    HookConVarChange(c=CreateConVar("votegameconfig_round",        "0",        "Round of voting:\n0 - begining maps; -X - only a specified, X - every."),    VR);
    if(fVE) VR(c, "","");
    AutoExecConfig(_, "VoteGameConfiguration", CONF_PATH);
    RegAdminCmd("sm_VGC",    GC, ADMFLAG_CONFIG,    "To start voting.");
    RegConsoleCmd("sm_vgc_info",    PI, "Information a status.");
    RegConsoleCmd("sm_votegame",    PV, "Open voting menu.");
}
public OnAutoConfigsBuffered() if(fVE)
{
    if(iVR==0) VCE();
    iSR = 0;
    new i=sizeof(sAudio)-1;
    do PrecacheSound(sAudio[i]);
    while(i--);
}
public OnMapEnd() if(fCT)
{
    UnhookEvent("player_spawn",    PS);
    fCT = 0.0;
}

public OnClientDisconnect_Post(C) if(iC[C])
{
    --iV[iC[C]];
    iC[C] = 0;
}

public VE(Handle:C, String:O[], String:N[]) if((fVE=GetConVarFloat(C))==0.0) VR(C, O,N);
public VR(Handle:C, String:O[], String:N[])
{
    if(iVR) UnhookEvent("round_end",    (iSR=0)<iVR ? RE:RO, EventHookMode_PostNoCopy);
    if((iVR=GetConVarInt(C))) HookEvent("round_end",    0<iVR ? RE:RO, EventHookMode_PostNoCopy);
}

public PS(Handle:E, String:N[], bool:B) MVC(GetClientOfUserId(GetEventInt(E,"userid")));
public RE(Handle:E, String:N[], bool:B) if(++iSR==iVR)
{
    if(fCT==0.0) VCE();
    iSR = 0;
}
public RO(Handle:E, String:N[], bool:B) if(--iSR==iVR) if(fCT==0.0) VCE();

public VC(Handle:P, MenuAction:A, C, O) if(A==MenuAction_Select)
{
    ++iV[iC[iV[0]=C]=O];
    EmitSound(iV,1, sAudio[1]);
}

public Action:EV(Handle:T)
{
    new i=MaxClients;
    do if(IsClientInGame(i)) if(IsFakeClient(i)==false) break;
    while(--i);
    decl String:f[9]="Config";
    if(i)
    {
        new n=MENU_ITEM, a, v;
        if(iV[0])
        {
            decl e;
            do
            {
                if(iV[n]>v) v = iV[e=n];
                a+= iV[n];
                iV[n] = 0;
            }while(--n);
            if(v)
            {
                IntToString(e, f[6],3);
                fCT = float(v*100)/a;
            }
        }decl String:b[193], String:t[96], c[i];
        n = 0;
        do if(IsClientInGame(i))
        {
            if(a)
            {
                FormatEx(t,sizeof(t), "%T", f,i);
                FormatEx(b,sizeof(b), "%T", "Decision Voters",i, CHAT_FORMAT,t);
                ReplaceString(b,2, "#","\x07");
                PrintToChat(i, b);
                FormatEx(b,sizeof(b), "%T", "Votes",i, CHAT_FORMAT,fCT,v,a);
            }else FormatEx(b,sizeof(b), "%T", "No Votes",i, CHAT_FORMAT);
            ReplaceString(b,2, "#","\x07");
            PrintToChat(c[n++]=i, b);
            iC[i] = 0;
        }while(--i);
        EmitSound(c,n, sAudio[0], _,_, SNDLEVEL_TRAIN);
    }else f = "Config0";
    ServerCommand("exec %s/%s.txt", CONF_PATH,f);
    OnMapEnd();
    iV[0] = 0;
}

public Action:GC(C, A)
{
    if(fCT) ReplyToCommand(C, "%t", "Already Vote", CHAT_FORMAT);
    else
    {
        VCE();
        C = MaxClients;
        do if(IsClientInGame(C)) MVC(C);
        while(--C);
    }return Plugin_Handled;
}
public Action:PI(C, A)
{
    if(A==MENU_ITEM)
    {
        decl String:n[24], String:v[6];
        GetPluginInfo(INVALID_HANDLE,PlInfo_Name, n,sizeof(n));
        GetPluginInfo(INVALID_HANDLE,PlInfo_Version, v,sizeof(v));
        ReplyToCommand(C, "\x01\04%s \x05v%s\x01: \x03%s", n,v,fCT ? "Performed":fVE ? "ON":"Off");
    }ReplyToCommand(C, "%t", "Info Settings", CHAT_FORMAT,fVE,iVR,iSR);
    return Plugin_Handled;
}
public Action:PV(C, A)
{
    MVC(C);
    return Plugin_Handled;
}

MVC(C) if(iC[C]==0)
{
    decl s;
    if(0 <(s=RoundToZero(fCT-GetTickedTime())))
    {
        decl String:t[200], String:f[9]="Config", Handle:p;
        FormatEx(t,sizeof(t), "%T", "Scenario",C);
        SetPanelTitle(p=CreatePanel(), t);
        new i;
        do{
            IntToString(++i, f[6],3);
            if(FormatEx(t,sizeof(t),"%T",f,C))
            {
                SetPanelCurrentKey(p, i);
                DrawPanelItem(p, t);
            }
        }while(i<MENU_ITEM);
        if(FormatEx(t,sizeof(t), "%T", "Scenario Text",C)) DrawPanelText(p, t);
        SendPanelToClient(p, iC[0]=C, VC, s);
        CloseHandle(p);
        EmitSound(iC,1, sAudio[2]);
    }
}
VCE()
{
    HookEvent("player_spawn",    PS);
    CreateTimer(fVE, EV, _, TIMER_FLAG_NO_MAPCHANGE);
    fCT = GetTickedTime()+fVE-1.0;
В раздел услуг или написание плагинов обратитесь, здесь не место этому
 

FuckYeah

Челик
Сообщения
474
Реакции
57
Решил создать кс го сервер, помимо текущего на ксс в34, и здесь непривычно то, что кнопка выход во всех менюшках назначена на кнопку 9, а в в34 на кнопку 0. Как мне переназначить кнопки? Нужно чтобы выход был на 0, далее на 9, назад 8
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Решил создать кс го сервер, помимо текущего на ксс в34, и здесь непривычно то, что кнопка выход во всех менюшках назначена на кнопку 9, а в в34 на кнопку 0. Как мне переназначить кнопки? Нужно чтобы выход был на 0, далее на 9, назад 8
Вместо меню, делай панели с кастомными кнопками
 

FuckYeah

Челик
Сообщения
474
Реакции
57
Вместо меню, делай панели с кастомными кнопками
1695198418192.png

Чтобы тут переназначить выход на 0 , нужно создавать отдельное что то?
 

SenatoR

Участник
Сообщения
773
Реакции
344
Посмотреть вложение 114303
Чтобы тут переназначить выход на 0 , нужно создавать отдельное что то?
Да, нужно делать не через меню, а через панели, для этого нужно будет переписывать все плагины, где используется меню.
В ксго в меню выход на 9 всегда
UPD: и в панели тоже, соответственно в ксго 0 не используется и вариантов нету
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
@SenatoR, и что, через панели в ксго получается делать 10 активных пунктов меню?
 

bimbo

Участник
Сообщения
5
Реакции
0
//
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
@bimbo, попробуй вот так:
C-подобный:
new iModeVote;

public OnPluginStart()
{
    HookEvent("round_freeze_end", round_freeze_end);
    LoadTranslations("menuA.phrases");
}
public round_freeze_end(Handle:event, const String:name[], bool:dontBroadcast)
{
    SetDifficulty(ModeGame);
}

public Action:PlayerPanel(client, args)
{
    new Handle:PlayerMenu = CreateMenu(PlayerMenuHandler);
    SetMenuTitle(PlayerMenu, "%t\n ", "MenuTitle", client);
    new String:Value[40];

    .......

    Format(Value, sizeof(Value), "%T", "MenuModeTitle", client);
    AddMenuItem(PlayerMenu, "8", Value);

    SetMenuExitButton(PlayerMenu, true);
    DisplayMenu(PlayerMenu, client, 30);

    return Plugin_Handled;
}

public PlayerMenuHandler(Handle:PlayerMenu, MenuAction:action, client, option)
{
    if (action == MenuAction_Select)
    {
        switch (option)
        {
            ......

            case 8: Menu_Mode(client);
        }
    }
}

Menu_Mode(client)
{
    new Handle:PlayerMenu = CreateMenu(ModeMenuHandler);
    SetMenuTitle(PlayerMenu, "%t\n ", "MenuModeTitle");
    new String:Value[64];

    FormatEx(Value, sizeof(Value), "%s%T", ModeGame == 0 ? "☑" : "☐", "ModeA", client);
    AddMenuItem(PlayerMenu, "0", Value);

    FormatEx(Value, sizeof(Value), "%s%T", ModeGame == 1 ? "☑" : "☐", "ModeB", client);
    AddMenuItem(PlayerMenu, "1", Value);

    FormatEx(Value, sizeof(Value), "%s%T", ModeGame == 2 ? "☑" : "☐", "ModeC", client);
    AddMenuItem(PlayerMenu, "2", Value);

    FormatEx(Value, sizeof(Value), "%s%T", ModeGame == 3 ? "☑" : "☐", "ModeD", client);
    AddMenuItem(PlayerMenu, "3", Value);

    FormatEx(Value, sizeof(Value), "%s%T", ModeGame == 4 ? "☑" : "☐", "ModeE", client);
    AddMenuItem(PlayerMenu, "4", Value);

    SetMenuExitButton(PlayerMenu, true);
    DisplayMenu(PlayerMenu, client, 30);
}

public ModeMenuHandler(Handle:PlayerMenu, MenuAction:action, client, option)
{
    if(action == MenuAction_End) CloseHandle(PlayerMenu);
    else if (action == MenuAction_Select)
    {
        if (ModeGame == option)
            PrintToChat(client, "%t", "ModeEnableAlready");
        else CallVoteChangeDifficulty(client, option);
    }
    return 0
}

static const String:VOTE_TITLE[][] =
{
    "EnableModeA",
    "EnableModeB",
    "EnableModeC",
    "EnableModeD",
    "EnableModeE"
}

public Action:CallVoteChangeDifficulty(client, any:ModeNum)
{
    if (h_Timer)
    {
        KillTimer(h_Timer);
        h_Timer = INVALID_HANDLE;
    }

    if (IsVoteInProgress())
    {
        PrintToChat(client, "%t", "VotingAlready");
        return;
    }

    if (b_TimeOutVote)
    {
        PrintToChat(client, "%t", "VotingTimeout");
        return;
    }

    i_TimerVote = 16; // время голосования в сек.
    h_Timer = CreateTimer(1.0, Timer_Func, _, TIMER_REPEAT);
    CreateTimer(60.0, Timer_FuncOut);
    b_TimeOutVote = true;

    iModeVote = ModeNum;

    //Считаем и записываем нужное число игроков по условиям
    new i_Clients[MAXPLAYERS / 2], i_Count;
    decl String:name[64];
    new Handle:menu = CreateMenu(Handle_VoteMenu, MenuAction_DisplayItem|MenuAction_Display);
    for (new i = 1; i <= MaxClients; i++) if (IsClientInGame(i) && !IsFakeClient(i) && GetClientTeam(i) == 2)
    {
        i_Clients[i_Count++] = i;
        GetClientName(i, name, sizeof(name));
        PrintToChat(i, "%t", "VotingStart", name);
    }

    SetMenuTitle(menu, "%T?\n ", VOTE_TITLE[ModeNum], i_Clients);

    Format(name, sizeof(name), "%T", "VoteYes", i_Clients);
    AddMenuItem(menu, "0", name);

    Format(name, sizeof(name), "%T", "VoteNo", i_Clients);
    AddMenuItem(menu, "1", name);

    SetMenuExitButton(menu, true);

    //Показываем меню голосования нужным игрокам (Число и ID которых, ранее записали в цикле)
    VoteMenu(menu, i_Clients, i_Count, 15);
}

public Handle_VoteMenu(Handle:menu, MenuAction:action, param1, param2)
{
    //param1 - клиент (Голосование при этом еще не закончено!!) param2- пункт голосования
    if (action == MenuAction_Select)
    {
        client_voted[param1] = true;
        if(param2)
            i_DownVote++;
        else
            i_UpVote++;
    }
    else if (action == MenuAction_End)
    {
        CloseHandle(menu);
        ResetVoteValues();
    }
    //param1 - победивший пункт голосования (Голосование закончилось)
    else if (action == MenuAction_VoteEnd)
    {
        if(!param1)
        {
            SetDifficulty();
            PrintToChatAll("%t %t.", "ApprovedMode", VOTE_TITLE[iModeVote][6]);
            PrintHintTextToAll("%t %t", "EnabledMode", VOTE_TITLE[iModeVote][6]);
        }
        else
        {
            PrintToChatAll("%t %t.", "UnapprovedMode", VOTE_TITLE[iModeVote][6]);
            PrintHintTextToAll("%t", "ModeNotChange");
        }

        ResetVoteValues();

        if (h_Timer)
        {
            KillTimer(h_Timer);
            h_Timer = INVALID_HANDLE;
        }
    }
    else if (action == MenuAction_DisplayItem)
    {
        decl String:buffer[PLATFORM_MAX_PATH];
        FormatEx(buffer, sizeof(buffer), "%T", param2 ? "VoteNo" : "VoteYes", param1);
        return RedrawMenuItem(buffer);
    }
    else if (action == MenuAction_Display)
    {
        SetMenuTitle(menu, "%t?\n ", VOTE_TITLE[ModeNum]);
    }
}

ResetVoteValues()
{
    for (new i = 1; i <= MaxClients; i++) client_voted[i] = false;
    i_UpVote = i_DownVote = 0;
}

public Action:Timer_Func(Handle:timer)
{
    if (--i_TimerVote > 0)
    {
        PrintHintTextToAll("%t\n%t\n< %d %t >", "UntilVotingEnd", i_UpVote, i_DownVote, "UntilVotingEnd_2", i_TimerVote, "UntilVotingEnd_3");
        return Plugin_Continue;
    }

    PrintHintTextToAll("%t", "ModeNotChange");
    // Время истекло, голосование окончено
    h_Timer = INVALID_HANDLE;
    return Plugin_Stop;
}

public Action:Timer_FuncOut(Handle:timer)
{
    b_TimeOutVote = false;
}

SetDifficulty()
{
    ModeGame = iModeVote;/*
    switch(mode)
    {
        case 3,4:
        {
//            ServerCommand("sm plugins unload");
        }
    }*/
}
 

bimbo

Участник
Сообщения
5
Реакции
0
//
 
Последнее редактирование:

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
выдавало ошибку, что не хватает ";" после "EnableModeE"
поставил. Появилось 001: expected token: "}", but found ";" и 054: unmatched closing brace ("}")
Menu:
static const String:VOTE_TITLE[][] =
{
    "EnableModeA",
    "EnableModeB",
    "EnableModeC",
    "EnableModeD",
    "EnableModeE";
}
после фигурной скобки если что
 

bimbo

Участник
Сообщения
5
Реакции
0
//
 
Последнее редактирование:

bimbo

Участник
Сообщения
5
Реакции
0
//
 
Последнее редактирование:

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
C-подобный:
TopMenu hTopMenu;
error 139: could not find type "TopMenu"
Хотя SourceMod Development
Где ошибка?
Ага
#include <adminmenu>
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
C-подобный:
TopMenu hTopMenu;
error 139: could not find type "TopMenu"
Хотя SourceMod Development
Где ошибка?
Ага
#include <adminmenu>
Я так и не понял, решил или нет? Если не решил - новую папку создай с чистым новым СМ или заново закинь новое апи к себе в компилятор или это добавь #include <topmenus>
 

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
Я так и не понял, решил или нет? Если не решил - новую папку создай с чистым новым СМ или заново закинь новое апи к себе в компилятор или это добавь #include <topmenus>
Да, решил, промахал #include <adminmenu>
 

Ice_Sochi

Участник
Сообщения
709
Реакции
413
Добрый день
Из урока сделал вывод, что rawline - просто текст, хотя в примере при помощи него пункт скрывается.
Мне нужна просто строчка с описанием под кликабельным пунктом. В чем я ошибаюсь?

Не работает (пункт не появляется):
FormatEx(sBuffer, sizeof(sBuffer), "%s_description", sStat);
Format(sBuffer, sizeof(sBuffer), "%T", sBuffer, iClient);
AddMenuItem(hMenu, "", sBuffer, ITEMDRAW_RAWLINE);

Работает (но мне не нужен номер пункта):
FormatEx(sBuffer, sizeof(sBuffer), "%s_description", sStat);
Format(sBuffer, sizeof(sBuffer), "%T", sBuffer, iClient);
AddMenuItem(hMenu, "", sBuffer, ITEMDRAW_DISABLED);
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Добрый день
Из урока сделал вывод, что rawline - просто текст, хотя в примере при помощи него пункт скрывается.
Мне нужна просто строчка с описанием под кликабельным пунктом. В чем я ошибаюсь?

Не работает (пункт не появляется):
FormatEx(sBuffer, sizeof(sBuffer), "%s_description", sStat);
Format(sBuffer, sizeof(sBuffer), "%T", sBuffer, iClient);
AddMenuItem(hMenu, "", sBuffer, ITEMDRAW_RAWLINE);

Работает (но мне не нужен номер пункта):
FormatEx(sBuffer, sizeof(sBuffer), "%s_description", sStat);
Format(sBuffer, sizeof(sBuffer), "%T", sBuffer, iClient);
AddMenuItem(hMenu, "", sBuffer, ITEMDRAW_DISABLED);
Используй панели. Там можешь все закастомить, хоть пункты, хоть стрелочки
 
Сверху Снизу