๋ฐ˜์‘ํ˜•

์Šฌ๋ผ์ด๋”ฉ ๋ฉ”๋‰ด(Sliding menu) / ์‚ฌ์ด๋“œ๋ฐ”(Sidebar)๋ž€?

์‚ฌ์ด๋“œ ๋ฐ”(Sidebar)๋Š” ์ฃผ๋กœ ์›น ํŽ˜์ด์ง€๋‚˜ ์Šค๋งˆํŠธํฐ ์–ดํ”Œ์—์„œ ๋งŽ์ด ๋ณด์•˜์„ ๊ฒ๋‹ˆ๋‹ค. ์ขŒ์ธก/์šฐ์ธก์˜ ํŠน์ • ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ฉ”๋‰ด๊ฐ€ ํ‘œ์‹œ๋˜๊ณ , ํŠน์ • ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋‹ค์‹œ ๋ฉ”๋‰ด๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ์‚ฌ์ด๋“œ๋ฐ” ๋ฉ”๋‰ด๊ฐ€ ๋ฏธ๋„๋Ÿฌ์ง€๋“ฏ์ด ๋‚˜ํƒ€๋‚˜๊ณ  ์‚ฌ๋ผ์ง€๋ฉด ์Šฌ๋ผ์ด๋”ฉ ๋ฉ”๋‰ด(Sliding menu)๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ œ ํ‹ฐ์Šคํ† ๋ฆฌ ๋ธ”๋กœ๊ทธ์—๋„ ์ด๋Ÿฌํ•œ ์‚ฌ์ด๋“œ ๋ฐ”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋‰ด ์•„์ด์ฝ˜์„ ํด๋ฆญํ•˜๋ฉด ์‚ฌ์ด๋“œ์— ์žˆ๋˜ ๋ฉ”๋‰ด๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ณ , ๋‹ค์‹œ ์‚ฌ๋ผ์ง€๋Š” ๋™์ž‘์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์‚ฌ์ด๋“œ ๋ฐ” ๋™์ž‘ ํ™”๋ฉด
์‚ฌ์ด๋“œ ๋ฐ” ๋™์ž‘ ํ™”๋ฉด

C#์—์„œ ๋งŒ๋“  ์Šฌ๋ผ์ด๋”ฉ ๋ฉ”๋‰ด ๋™์ž‘

C#์€ MFC๋ณด๋‹ค UI ์ž‘์—…ํ•˜๊ธฐ๊ฐ€ ์ •๋ง ์ •๋ง ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋™์•ˆ ์™œ ์ด๋ ‡๊ฒŒ MFC๋ฅผ ๊ณ ์ง‘ํ–ˆ๋‚˜ ์‹ถ์„ ์ •๋„์ž…๋‹ˆ๋‹ค. ์•„๋ฌดํŠผ, ์ด๋ ‡๊ฒŒ ํŽธํ•œ C#์—์„œ๋„ ์•„์‰ฝ์ง€๋งŒ ์‚ฌ์ด๋“œ ๋ฐ”๋‚˜ ์Šฌ๋ผ์ด๋”ฉ ๋ฉ”๋‰ด ์ปจํŠธ๋กค์€ ์—†์Šต๋‹ˆ๋‹ค.

์ œ๊ณต๋˜๋Š” ์ปจํŠธ๋กค์ด ์—†์–ด ์ง์ ‘ ๋งŒ๋“ค์–ด์•ผ ํ•˜์ง€๋งŒ, ๋„ˆ๋ฌด๋‚˜๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ๋ณธ ํฌ์ŠคํŒ…์—์„œ ๋‹ค๋ฃฐ ์˜ˆ์ œ ์ฝ”๋“œ์˜ ๋™์ž‘์ž…๋‹ˆ๋‹ค.

์Šฌ๋ผ์ด๋”ฉ ๋ฉ”๋‰ด ๋™์ž‘ ํ™”๋ฉด
์Šฌ๋ผ์ด๋”ฉ ๋ฉ”๋‰ด ๋™์ž‘ ํ™”๋ฉด

C#์—์„œ ์Šฌ๋ผ์ด๋”ฉ ๋ฉ”๋‰ด ๋งŒ๋“ค๊ธฐ

๊ทธ๋Ÿผ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ExamSlidingMenu๋ผ๋Š” ์ด๋ฆ„์˜ WinForm ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ExamSlidingMenu ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
ExamSlidingMenu ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

Form์— Panel์„ ์ถ”๊ฐ€ํ•˜๊ณ , Dock ์„ค์ •์„ Left๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋กœ ํญ์€ 200์ด๊ณ , ์ด๋ฆ„์€ panelSideMenu์ž…๋‹ˆ๋‹ค. ์ด ํŒจ๋„์— ๋ฉ”๋‰ด ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ•  ๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŒจ๋„์ด ๋ณด์˜€๋‹ค ์ ‘ํ˜”๋‹ค ํ•˜๋Š” ๊ฒƒ์ด์ฃ .

panelSideMenu๋ฅผ Form์˜ Left์— ๋„ํ‚น๋œ ๋ชจ์Šต
panelSideMenu๋ฅผ Form์˜ Left์— ๋„ํ‚น๋œ ๋ชจ์Šต

๋ณ€๊ฒฝํ•œ ์†์„ฑ์€ ์•„๋ž˜ ํ‘œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

ํ•ญ๋ชฉ ๊ฐ’
Name panelSideMenu
Dock Left
Size(Width) 200
BackColor 64, 64, 64

์ด์ œ Button์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํŒจ๋„์— ์ถ”๊ฐ€๋˜๋Š” ๋ฒ„ํŠผ์€ ์Šฌ๋ผ์ด๋”ฉ ๋ฉ”๋‰ด์˜ ๋ฉ”๋‰ด ๋ฒ„ํŠผ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆผ ์•„๋ž˜์— ์žˆ๋Š” ํ‘œ์™€ ๊ฐ™์ด ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋ฉด, ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋ฒ„ํŠผ์ด ๊พธ๋ฉฐ์ง‘๋‹ˆ๋‹ค.

ํŒจ๋„์— ๋ฉ”๋‰ด ๋ฒ„ํŠผ์ด ์ถ”๊ฐ€๋œ ๋ชจ์Šต
ํŒจ๋„์— ๋ฉ”๋‰ด ๋ฒ„ํŠผ์ด ์ถ”๊ฐ€๋œ ๋ชจ์Šต

ํ•ญ๋ชฉ ๊ฐ’
Name button1
Dock Top
Size 200, 50
BackColor 64, 64, 64
FlatStyle Flat
BorderSize 0
MouseDownBackColor 60, 60, 60
MouseOverBackColor 70, 70, 70
ForeColor White
Text ๋ฒ„ํŠผ1

๋™์ผํ•œ ๋ฒ„ํŠผ์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ ๋„ฃ์œผ๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฉ”๋‰ด ๋ฒ„ํŠผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฉ”๋‰ด ๋ฒ„ํŠผ์ด ์ถ”๊ฐ€๋œ ๋ชจ์Šต
์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฉ”๋‰ด ๋ฒ„ํŠผ์ด ์ถ”๊ฐ€๋œ ๋ชจ์Šต

์ด๋ฒˆ์—๋Š” CheckBox๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ฒดํฌ ๋ฐ•์Šค ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋ฉ”๋‰ด๊ฐ€ ์ ‘ํžˆ๊ฑฐ๋‚˜ ๋ณด์—ฌ์ฃผ๋Š” ๋™์ž‘์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ฒดํฌ ๋ฐ•์Šค๊ฐ€ ์ถ”๊ฐ€๋œ ๋ชจ์Šต
์ฒดํฌ ๋ฐ•์Šค๊ฐ€ ์ถ”๊ฐ€๋œ ๋ชจ์Šต

ํ•ญ๋ชฉ ๊ฐ’
Name checkBoxHide
AutoSize False
Dock Bottom
Size 200, 50
Appearance Button
BackColor 64, 64, 64
FlatStyle Flat
BorderSize 0
MouseDownBackColor 60, 60, 60
MouseOverBackColor 70, 70, 70
ForeColor White
Text <
TextAlign Middlecenter

์—ฌ๊ธฐ๊นŒ์ง€ UI๋ฅผ ์ ์šฉํ–ˆ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ชจ์Šต์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฉ”๋‰ด ๋ฒ„ํŠผ๊ณผ ์ˆจ๊ธฐ๊ธฐ ๋ฒ„ํŠผ์ด ์ถ”๊ฐ€๋œ ๋ชจ์Šต
๋ฉ”๋‰ด ๋ฒ„ํŠผ๊ณผ ์ˆจ๊ธฐ๊ธฐ ๋ฒ„ํŠผ์ด ์ถ”๊ฐ€๋œ ๋ชจ์Šต

๋งˆ์ง€๋ง‰์œผ๋กœ Timer๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด๋”ฉ ๋ฉ”๋‰ด๊ฐ€ ์„œ์„œํžˆ ์ ‘ํžˆ๊ณ , ๋ณด์ด๋Š” ๋™์ž‘์€ ํƒ€์ด๋จธ์—์„œ ์ด๋ค„์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ ๊ฐ’
Name timerSliding
Interval 10

์ด์ œ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ExamSlidingMenu
{
    public partial class Form1 : Form
    {
        //์Šฌ๋ผ์ด๋”ฉ ๋ฉ”๋‰ด์˜ ์ตœ๋Œ€, ์ตœ์†Œ ํญ ํฌ๊ธฐ
        const int MAX_SLIDING_WIDTH = 200;
        const int MIN_SLIDING_WIDTH = 50;
        //์Šฌ๋ผ์ด๋”ฉ ๋ฉ”๋‰ด๊ฐ€ ๋ณด์ด๋Š”/์ ‘ํžˆ๋Š” ์†๋„ ์กฐ์ ˆ
        const int STEP_SLIDING = 10;
        //์ตœ์ดˆ ์Šฌ๋ผ์ด๋”ฉ ๋ฉ”๋‰ด ํฌ๊ธฐ
        int _posSliding = 200;

        public Form1()
        {
            InitializeComponent();
        }

        private void checkBoxHide_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBoxHide.Checked == true)
            {
                //์Šฌ๋ผ์ด๋”ฉ ๋ฉ”๋‰ด๊ฐ€ ์ ‘ํ˜”์„ ๋•Œ, ๋ฉ”๋‰ด ๋ฒ„ํŠผ์˜ ํ‘œ์‹œ
                button1.Text = "1";
                button2.Text = "2";
                checkBoxHide.Text = ">";
            }
            else
            {
                //์Šฌ๋ผ์ด๋”ฉ ๋ฉ”๋‰ด๊ฐ€ ๋ณด์˜€์„ ๋•Œ, ๋ฉ”๋‰ด ๋ฒ„ํŠผ์˜ ํ‘œ์‹œ
                button1.Text = "๋ฒ„ํŠผ1";
                button2.Text = "๋ฒ„ํŠผ2";
                checkBoxHide.Text = "<";
            }

            //ํƒ€์ด๋จธ ์‹œ์ž‘
            timerSliding.Start();
        }

        private void timerSliding_Tick(object sender, EventArgs e)
        {
            if (checkBoxHide.Checked == true)
            {
                //์Šฌ๋ผ์ด๋”ฉ ๋ฉ”๋‰ด๋ฅผ ์ˆจ๊ธฐ๋Š” ๋™์ž‘
                _posSliding -= STEP_SLIDING;
                if (_posSliding <= MIN_SLIDING_WIDTH)
                    timerSliding.Stop();
            }
            else
            {
                //์Šฌ๋ผ์ด๋”ฉ ๋ฉ”๋‰ด๋ฅผ ๋ณด์ด๋Š” ๋™์ž‘
                _posSliding += STEP_SLIDING;
                if (_posSliding >= MAX_SLIDING_WIDTH)
                    timerSliding.Stop();
            }

            panelSideMenu.Width = _posSliding;
        }
    }
}

์ฒดํฌ ๋ฐ•์Šค์˜ ์ด๋ฒคํŠธ์™€ ํƒ€์ด๋จธ์˜ ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋ฏ€๋กœ ์ƒ๋žตํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐ ์ปจํŠธ๋กค์„ ๋”๋ธ” ํด๋ฆญํ•˜๋ฉด checkboxHide_CheckedChanged()์™€ timerSliding_Tick() ์ด๋ฒคํŠธ ํ•จ์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ๊ฐ€ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋™์ž‘์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
โ‘  28๋ฒˆ ๋ผ์ธ์˜ checkBoxHide_CheckedChanged() ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ฒดํฌ ๋ฐ•์Šค์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
โ‘ก ์ฒดํฌ ๋ฐ•์Šค์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค(30๋ฒˆ ๋ผ์ธ). ์ข€ ๋” ์‘์šฉํ•˜๋ฉด, ์—ฌ๊ธฐ์— ์•„์ด์ฝ˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋” ์˜ˆ์˜๊ฒŒ ๊พธ๋ฐ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ‘ข ๊ทธ๋ฆฌ๊ณ  45๋ฒˆ ๋ผ์ธ์ด ํ˜ธ์ถœ๋˜์–ด timerSliding์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
โ‘ฃ 49๋ฒˆ ๋ผ์ธ์˜ timerSliding_Tick() ํƒ€์ด๋จธ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
โ‘ค 51๋ฒˆ ๋ผ์ธ์—์„œ ์ฒดํฌ ๋ฐ•์Šค์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
โ‘ฅ ์ฒดํฌ ์ƒํƒœ์— ๋”ฐ๋ผ _posSliding๋ฅผ STEP_SLIDING๋งŒํผ ์ฆ๊ฐํ•˜๊ณ , panelSideMenu์˜ ํญ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋™์ž‘์€ MIN_SLIDING_WIDTH, MAX_SLIDING_WIDTH ๋งŒํผ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ, ์Šฌ๋ผ์ด๋”ฉ ๋ฉ”๋‰ด๋ฅผ ์ฒœ์ฒœํžˆ ๋™์ž‘ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด STEP_SLIDING ๊ฐ’์„ ์ค„์ด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋ ค๋ฉด ๊ฐ’์„ ๋Š˜๋ฆฌ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์œ„ โ‘ก๋ฒˆ์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ, ์ด๋ฏธ์ง€๋ฅผ ๋„ฃ์œผ๋ฉด ์‚ฌ์ด๋“œ ๋ฐ”๊ฐ€ ์ ‘ํ˜”์„ ๋•Œ ๋ฉ”๋‰ด ๋ฒ„ํŠผ์„ ์•„์ด์ฝ˜์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ฉ”๋‰ด๋ฅผ ์ข€ ๋” ์ง๊ด€์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

๋ฉ”๋‰ด ๋ฒ„ํŠผ์„ ์•„์ด์ฝ˜์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ
๋ฉ”๋‰ด ๋ฒ„ํŠผ์„ ์•„์ด์ฝ˜์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ

์ž์„ธํ•œ ์ฝ”๋“œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜ ์ฒจ๋ถ€๋œ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

ExamSlidingMenu.zip
0.01MB

๋ฐ˜์‘ํ˜•